4D v17.4

dataClass.query( )

Inicio

 
4D v17.4
dataClass.query( )

dataClass.query( )  


 

El método dataClass.query( ) busca entidades que cumplan los criterios de búsqueda especificados en cadenaBusq y (opcionalmente) valor, para todas las entidades de la clase de datos o de la selección de entidades y devuelve un nuevo objeto de tipo EntitySelection que contiene todas las entidades de la clase de datos que fueron encontradas. Se aplica carga diferida.

Si no se encuentran entidades coincidentes, se devuelve una EntitySelection vacía.

El parámetro cadenaBusq utiliza la siguiente sintaxis:

rutaAtributo comparador valor {operadorLogico rutaAtributo comparador valor}

donde:

  • rutaAtributo : nombre del atributo de clase de datos en el que desea ejecutar la búsqueda, por ejemplo, "country". Este parámetro puede ser cualquier ruta de atributo válida, como "country.name".
    En el caso de una ruta de atributo cuyo tipo es Collection, la notación [] se usa para manejar todas las ocurrencias.

          Nota: no puede consultar los atributos cuyo nombre contenga caracteres especiales como "." o "[]" porque se evaluarán incorrectamente en la cadena de consulta. Para más información, consulte el párrafo Identificadores de propiedades de objetos. Además, los nombres de los atributos no pueden contener símbolos como "=", ">", "#"..., que pueden interpretarse como comparadores (ver abajo).

  • comparador: símbolo que compara rutaAtributo y valor. Los siguientes símbolos son soportados:
    ComparaciónSímbolo(s)Comentario
    Igual a =, ==Obtiene datos coincidentes, soporta el comodín (@), no distingue entre mayúsculas y minúsculas ni diacrítico.
    ===, ISObtiene datos que coinciden, considera el comodín (@) como un carácter estándar, no distingue entre mayúsculas y minúsculas ni es diacrítico
    No igual a#, !=Soporta el comodín (@)
    !==, IS NOTConsidera el comodín (@) como un carácter estándar,
    #, !=, is not
    Menor que <
    Mayor que >
    Menor o igual a <=
    Mayor que o igual a >=
    Incluido enINObtiene datos iguales para al menos uno de los valores en una colección o en un conjunto de valores
    Condición No aplicada a una instrucciónNOTLos paréntesis son obligatorios cuando se usa Not antes de una instrucción que contiene varios operadores
    Contiene palabra clave%Las palabras claves se pueden usar en atributos de tipo texto o  imagen
  • valor: el valor a comparar con el valor actual de la propiedad de cada objeto en la colección o selección de entidad. Puede ser cualquier expresión del mismo tipo de datos que la propiedad o un separador de posición: paramIndex (ver abajo).
    Los valores constantes se dan entre comillas simples. Las siguientes palabras claves están prohibidas para las constantes: true, false. Puede comparar el valor Null en una búsqueda utilizando la palabra clave "null". Esta búsqueda encontrará propiedades null y undefined
    Para buscar una cadena dentro de una cadena (una búsqueda "contiene"), utilice el símbolo comodín (@) en valor para aislar la cadena que se va a buscar como se muestra en este ejemplo: "@Smith@".
    Para valores numéricos, los separadores decimales son el punto. Las fechas deben ser provistas con el formato "AAAA-MM-DD".
    En el caso de una búsqueda con un comparador IN, valor debe ser una colección, o valores que coincidan con el tipo de la ruta del atributo entre [] separados por comas (para cadenas, "los caracteres se deben escapar con "\").   
  • operadorLogico: utilizado para unir múltiples condiciones en la búsqueda (opcional). Puede usar uno de los siguientes operadores lógicos (puede pasar el nombre o el símbolo):
    Conjunción Símbolo(s)
    AND&, &&, and
    OR|, ||, or

Utilizando comillas
Cuando utiliza comillas dentro de búsquedas, debe usar comillas simples ' ' dentro de la búsqueda y comillas dobles " " para abarcar toda la búsqueda, de lo contrario, se devuelve un error. Por ejemplo:

"employee.name = 'smith' AND employee.firstname = 'john'"

Nota: las comillas simples (') no se soportan en los valores buscados, ya que romperían la cadena de consulta. Por ejemplo, "comp.name = 'John's pizza' " generará un error. Si necesita buscar valores con comillas simples, puede considerar el uso de marcadores de posición (ver abajo).

Utilizando paréntesis
Puede utilizar paréntesis en búsquedas para dar prioridad al cálculo. Por ejemplo, puede organizar una búsqueda de la siguiente manera:

"(employee.age >= 30 OR employee.age <= 65) AND (employee.salary <= 10000 OR employee.status = 'Manager')"

Los parámetros valor se deben usar cuando la consulta se genera con marcadores de posición. Los marcadores de posición son etiquetas que se inserta en cadenas de búsqueda y que se reemplazan por otro valor cuando se evalúa la cadena de búsqueda. Puede usar hasta 128 parámetros de valor.

Nota: los valores para los marcadores de posición también se pueden pasar como una colección en la propiedad de parámetros del parámetro opcional confBusq (solo para las consultas entitySelection y dataClass). Para más información, consulte el párrafo Parámetro confBusq.

En cadenaBusq, inserte :paramIndex para cada marcador de posición (lo que significa "use el parámetro paramIndex de la consulta como el valor a comparar") y luego, pase el(los) valor(es) solicitado(s) como parámetro(s) valor. Por ejemplo, para consultar a los empleados que viven en Chicago y ganan menos de 10 000, puede escribir:

"employee.city = :1 & employee.salary < :2"; "Chicago";10000

El valor se evalúa una vez al comienzo de la consulta; no se evalúa para cada elemento.

Se recomienda utilizar marcadores de posición en consultas por dos motivos:

  1. Evita la inserción de código malicioso: si utiliza directamente variables llenadas por usuarios dentro de la cadena de consulta, un usuario podría modificar las condiciones de consulta al ingresar argumentos de consulta adicionales. Por ejemplo, imagine una cadena de consulta como:
     $vquery:="status = 'public' & name = "+myname //user enters their name
     $result:=$col.query($vquery)

    Esta consulta parece segura ya que los datos no públicos se filtran. Sin embargo, si el usuario introduce en el área $myname algo así como smith OR status='private', la cadena de consulta se modificaría en el paso de interpretación y podría devolver datos privados.
    Al utilizar marcadores de posición, no es posible prevalecer sobre las condiciones de seguridad:
     $result:=$col.query("status='public' & name=:1";$myvar)

    En este caso, si el usuario introduce OR status='private' en el área $myvar, no se interpretará en la cadena de consulta, sino que solo se pasará como un valor. Buscar una persona llamada "OR status='private'" simplemente fallará.
  2. Evita tener que preocuparse por problemas de formato o caracteres. Además, permite el uso de variables o expresiones en argumentos de consulta. Ejemplos:
     $result:=$col.query("address.city = :1 & name =:2";$city;$myVar+"@")
     $result2:=$col.query("company.name = :1";"John's Pizzas")

Buscando valores null
Cuando busca valores null, no puede usar la sintaxis de marcador de posición porque el motor de consulta considera null como un valor de comparación inesperado. Por ejemplo, si ejecuta la siguiente consulta:

 $vSingles:=ds.Person.query("spouse = :1";Null// NO funcionará

No obtendrá el resultado esperado porque el valor null será evaluado por 4D como un error resultante de la evaluación del parámetro (por ejemplo, un atributo procedente de otra consulta). Para este tipo de búsquedas, debe usar la sintaxis de consulta directa:
 $vSingles:=ds.Person.query("spouse = null") //sintaxis correcta

Nota: este parámetro solo es soportado por los métodos entitySelection.query( ) y dataClass.query( ).

En el parámetro confBusq, puede pasar un objeto que contenga opciones adicionales. Las siguientes propiedades son soportadas:

PropiedadTipoDescripción
parámetrosColecciónValores a comparar cuando se usan marcadores de posición en cadenaBusq (forma alternativa de pasar valores a los marcadores de posición). Si algunos valores también se han pasado directamente en parámetros valor, estos valores se anexan a la secuencia de marcador de posición.
planBusquedaBooleanoEn la colección de entidades resultante, devuelve o no devuelve la descripción detallada de la consulta justo antes de que se ejecute, es decir, la consulta planificada. La propiedad devuelta es un objeto que incluye cada consulta planeada y subconsulta (en el caso de una consulta compleja). Esta opción es útil durante la fase de desarrollo de una aplicación. Por lo general, se utiliza junto con queryPath. Predeterminado si se omite: false
rutaBusquedaBooleanoEn la colección de entidades resultante, devuelve o no devuelve la descripción detallada de la consulta tal como se realiza. La propiedad devuelta es un objeto que contiene la ruta real utilizada para la consulta (generalmente idéntica a la de queryPlan, pero puede diferir si el motor logra optimizar la consulta), así como el tiempo de procesamiento y la cantidad de registros encontrados. Esta opción es útil durante la fase de desarrollo de la aplicación. Por defecto si se omite: false

Acerca de planBusqueda y rutaBusqueda
La información registrada en planBusqueda/rutaBusqueda incluye el tipo de consulta (indexada y secuencial) y cada subconsulta necesaria junto con los operadores de conjunción. Las rutas de búsqueda también contienen la cantidad de entidades encontradas y el tiempo requerido para ejecutar cada criterio de búsqueda. Puede resultarle útil analizar esta información mientras desarrolla sus aplicaciones. En general, la descripción del plan de búsqueda y su ruta son idénticos, pero pueden diferir porque 4D puede implementar optimizaciones dinámicas cuando se ejecuta una búsqueda para mejorar el rendimiento. Por ejemplo, el motor 4D puede convertir dinámicamente una búsqueda indexada en una secuencial si estima que es más rápida. Este caso particular puede ocurrir cuando el número de entidades que se buscan es bajo.

Por ejemplo, si ejecuta la siguiente búsqueda:

 $sel:=ds.Employee.query("salary < :1 and employer.name = :2 or employer.revenues > :3";50000;"Lima West Kilo";10000000;New object("queryPath";True;"queryPlan";True))

queryPlan:

{Or:[{And:[{item:[index : Employee.salary ] < 50000},{item:Join on Table : Company  :  Employee.employerID = Company.ID,subquery:[{item:[index : Company.name ] = Lima West Kilo}]}]},{item:Join on Table : Company  :  Employee.employerID = Company.ID,subquery:[{item:[index : Company.revenues ] > 10000000}]}]}

queryPath:

{steps:[{description:OR,time:63,recordsfounds:1388132,steps:[{description:AND,time:32,recordsfounds:131,steps:[{description:[index : Employee.salary ] < 50000,time:16,recordsfounds:728260},{description:Join on Table : Company  :  Employee.employerID = Company.ID,time:0,recordsfounds:131,steps:[{steps:[{description:[index : Company.name ] = Lima West Kilo,time:0,recordsfounds:1}]}]}]},{description:Join on Table : Company  :  Employee.employerID = Company.ID,time:31,recordsfounds:1388132,steps:[{steps:[{description:[index : Company.revenues ] > 10000000,time:0,recordsfounds:933}]}]}]}]}

Aquí hay varios ejemplos de consultas válidas.

Consulta estándar con marcadores de posición:

 $entitySelection:=dataClass.query("(firstName = :1 or firstName = :2) and (lastName = :3 or lastName = :4)";"D@";"R@";"S@";"K@")

Consulta estándar sin marcadores de posición:

 $entitySelection :=dataClass.query("firstName = 'S@'")

Consulta con un dataClass relacionado:

 $entitySelection:=dataClass.query("lastName = :1 and manager.lastName = :2";"M@";"S@")

Consulta con objetos queryPlan y queryPath:

 $entitySelection:=dataClass.query("(firstName = :1 or firstName = :2) and (lastName = :3 or lastName = :4)";"D@";"R@";"S@";"K@";New object("queryPlan";True;"queryPath";True))
 
  //Puede obtener estas propiedades en la selección de entidad resultante
 C_OBJECT($queryPlan;$queryPath)
 $queryPlan:=$entitySelection.queryPlan
 $queryPath:=$entitySelection.queryPath

Consulta con marcadores de posición y valores dados como una colección:

 $params:=New object
 $params.parameters:=New collection("D@";"R@";"S@";"K@")
 $entitySelection:=dataClass.query("(firstName = :1 or firstName = :2) and (lastName = :3 or lastName = :4)";$params)

Consulta con una declaración NOT:

 $entitySelection:=dataClass.query("not(firstName=Kim)")

Consulta con una ruta de atributo de tipo Collection:

 $entitySelection:=dataClass.query("additionalInfo.hobbies[].name = horsebackriding")

Consulta con una ruta de atributo de tipo Object:

 $entitySelection:=ds.Employee.query("extra.eyeColor = :1";"blue")

Consulta con una declaración IN:

 $entitySelection:=dataClass.query("firstName in :1";New collection("Kim";"Dixie"))

Consulta con una instrucción NOT (IN):

 $entitySelection:=ds.Employee.query("not (firstName in :1)";New collection("John";"Jane"))

Consulta con una fecha:

 $entitySelection:=dataClass.query("birthDate > :1";"1970-01-01")



Ver también 

collection.query( )
dataClass.all( )
dataClass.newSelection( )
entitySelection.query( )
entitySelection.queryPath
entitySelection.queryPlan

 
PROPIEDADES 

Producto: 4D
Tema: ORDA - DataClass

 
CONTENIDO DE LA PÁGINA 
 
HISTORIA 

 
ARTICLE USAGE

Manual de lenguaje 4D ( 4D v17)
Manual de lenguaje 4D ( 4D v17.1)
Manual de lenguaje 4D ( 4D v17.2)
Manual de lenguaje 4D ( 4D v17.3)
Manual de lenguaje 4D ( 4D v17.4)