i
Ejecución de Consultas SQL
Las consultas SQL son útiles cuando se trabaja con grandes volúmenes de datos. Una gran ventaja de usar estas consultas es que permiten recuperar solo la información que se necesita, en lugar de cargar todo el objeto modelo.
Si se utiliza el objeto SearchCriteria para buscar datos, se recuperan los objetos completos para esa entidad, aunque solo se necesite, por ejemplo, los identificadores de las instancias. Esto significa que se está cargando más información de la necesaria.
En cambio, con las consultas SQL disponibles en Deyel SDK, se pueden recuperar únicamente los datos específicos requeridos, lo que hace que el procesamiento sea más rápido y eficiente.
Otra gran ventaja de utilizar consultas SQL con Deyel SDK es la posibilidad de realizar operaciones JOIN entre entidades, una funcionalidad que no está disponible en SearchCriteria.
Búsquedas para Consultas SQL
Las búsquedas sobre las consultas SQL se pueden realizar mediante el uso de los siguientes objetos.
QueryCriteria: objeto sobre el que se agregan las diferentes partes de la consulta SQL. Con el mismo, se puede especificar qué campos recuperar de una instancia de entidad, si se trabaja con iterativos o no, así como el orden y agrupamiento de la búsqueda, las condiciones de límite y otras operaciones que se detallan en los ejemplos.
Servicio del Formulario - Método executeQuery(): clase servicio del formulario sobre el cual se realiza la búsqueda. Contiene la operación executeQuery(formInstance, queryCriteria), que recibe como parámetros el objeto modelo de la entidad con el que se está trabajando y el objeto QueryCriteria. Retorna un objeto QueryResult como resultado.
Modelo del Formulario - getter ... QueryName(): clase modelo del formulario sobre la cual se quiere ejecutar la consulta SQL. Contiene métodos getter para cada uno de los campos modelados, y estos métodos tienen la particularidad de finalizar con QueryName. Deben ser utilizados al añadir las distintas partes de la consulta a generar.
QueryResult: objeto que contiene los resultados de la ejecución de la consulta SQL. Los mismos están agrupados por columna (campo de la entidad), lo que significa que, para interactuar con el objeto QueryResult, se indica qué campo se desea recuperar y se obtiene una lista que representa cada una de las filas recuperadas tras la consulta SQL.
Métodos
A continuación se describen los métodos para trabajar con los distintos objetos.
Métodos para ejecutar con el objeto QueryCriteria
Método |
Descripción |
Parámetros |
---|---|---|
createSelect(pList) |
Crea una sentencia “SELECT” y agrega a la misma los valores presentes en el parámetro pList. |
Tipo java.util.List pList: : contiene cada uno de los campos a recuperar del formulario, excluyendo los campos de contenedor iterativo |
createSelectWithIterative(pList, pMap) |
Crea una sentencia “SELECT” y agrega a la misma los valores presentes en el parámetro pList y pMap. |
Tipo java.util.List pList: contiene cada uno de los campos a recuperar del formulario, excluyendo los campos de contenedor iterativo
Tipo Java.util.Map pMap: contiene, como clave, el identificador del iterativo. Los campos del iterativo son agregados como valor de la clave del mapa dentro de un objeto java.util.List |
addConditionLimits(pPageNumber,pPerPage) |
Agrega condiciones de límite a la sentencia SQL junto con la página a recuperar. |
pPageNumber: número de página a recuperar
pPerPage: número de registros a recuperar en la página. Por defecto, son 100, y como máximo, 10000 |
addGroupBy(pColumn) |
Agrega la cláusula GROUP BY a la sentencia SQL. |
String pColumn: representa el identificador del campo del formulario por el que se desea realizar el agrupamiento |
addGroupBy(pIterativeName, pColumn) |
Agrega la cláusula GROUP BY a la sentencia SQL. |
String pIterativeName: indica el identificador del iterativo al cual pertenece el campo indicado en pColumn
String pColumn: representa el identificador del campo del formulario por el que se desea realizar el agrupamiento |
addOrderCriteria(pColumn,pOrderDesc) |
Agrega la cláusula ORDER BY a la sentencia SQL. |
String pColumn: representa el identificador del campo del formulario por el que se desea realizar el ordenamiento
Boolean pOrderDesc: con valor "True" indica orden descendente, "False", ascendente |
addOrderCriteria(pIterativeName,pColumn,pOrderDesc) |
Agrega la cláusula ORDER BY a la sentencia SQL considerando campos de iterativo. |
String pIterativeName: indica el identificador del iterativo al cual pertenece el campo indicado en pColumn
String pColumn: representa el identificador del campo del formulario por el que se desea realizar el ordenamiento
Boolean pOrderDesc: con valor "True" indica orden descendente, "False", ascendente |
addConditionBetween(pColumn,pValueFrom, pValueTo) |
Agrega a la sentencia la condición BETWEEN. El valor buscado estará entre los valores indicados en los parámetros pValueFrom y pValueTo. |
String pColumn: representa el identificador del campo del formulario
Tipo Object pValueFrom: representa el valor inicial a partir del cual se busca coincidencia con el valor de pColumn
Tipo Object pValueTo: representa el valor final a partir del cual se busca coincidencia con el valor de pColumn |
addConditionBetween(pIterativeName,pColumn,pValueFrom, pValueTo) |
Agrega a la sentencia la condición BETWEEN. El valor buscado estará entre los valores indicados en los parámetros pValueFrom y pValueTo. |
String pIterativeName: indica el identificador del iterativo al cual pertenece el campo indicado en pColumn
String pColumn: representa el identificador del campo del formulario
Tipo Object pValueFrom: representa el valor inicial a partir del cual se busca coincidencia con el valor de pColumn
Tipo Object pValueTo: representa el valor final a partir del cual se busca coincidencia con el valor de pColumn |
addConditionGreater(pColumn,pValue, useGreaterOrEqual) |
Agrega a la sentencia SQL la condición > o >=. |
String pColumn: representa el identificador del campo del formulario
Tipo Object pValue: contiene el valor que se compara para el campo contenido en pColumn
Boolean useGreaterOrEqual: indica si se usa o no el operador mayor o igual. Con valor "True", se utiliza >=, "False", > |
addConditionGreater(pIterativeName, pColumn, pValue, useGreaterOrEqual) |
Agrega a la sentencia SQL la condición > o >=. |
String pIterativeName: indica el identificador del iterativo al cual pertenece el campo indicado en pColumn
String pColumn: representa el identificador del campo del formulario
Tipo Object pValue: contiene el valor que se compara para el campo contenido en pColumn
Boolean useGreaterOrEqual: indica si se usa o no el operador mayor o igual. Con valor "True", se utiliza >=, "False", > |
addConditionLike(pColumn, pValue) |
Agrega a la sentencia SQL la condición LIKE. |
String pColumn: representa el identificador del campo del formulario
String pValue: contiene el valor para la condición LIKE |
addConditionLike(pIterativeName, pColumn, pValue) |
Agrega a la sentencia SQL la condición LIKE. |
String pIterativeName: indica el identificador del iterativo al cual pertenece el campo indicado en pColumn
String pColumn: representa el identificador del campo del formulario
String pValue: contiene el valor para la condición LIKE |
addConditionLower(pColumn, pValue, useLowerOrEqual) |
Agrega a la sentencia SQL la condición < o <=. |
String pColumn: representa el identificador del campo del formulario
Tipo Object pValue: contiene el valor que se compara para el campo contenido en pColumn
Boolean useLowerOrEqual: indica si se usa o no el operador mayor o igual. Con valor "True", se utiliza <=, "False", < |
addConditionLower(pIterativeName, pColumn, pValue, useLowerOrEqual) |
Agrega a la sentencia SQL la condición < o <=. |
String pIterativeName: indica el identificador del iterativo al cual pertenece el campo indicado en pColumn
String pColumn: representa el identificador del campo del formulario
Tipo Object pValue: contiene el valor que se compara para el campo contenido en pColumn
Boolean useLowerOrEqual: indica si se usa o no el operador mayor o igual. Con valor "True", se utiliza <=, "False", < |
addConditionNotEquals(pColumn, pValue) |
Agrega a la sentencia SQL la condición !=. |
String pColumn: representa el identificador del campo del formulario
Tipo Object pValue: contiene el valor que se compara para el campo contenido en pColumn |
addConditionNotEquals(pIterativeName, pColumn, pValue) |
Agrega a la sentencia SQL la condición !=. |
String pIterativeName: indica el identificador del iterativo al cual pertenece el campo indicado en pColumn
String pColumn: representa el identificador del campo del formulario
Tipo Object pValue: contiene el valor que se compara para el campo contenido en pColumn |
addConditionEquals(pColumn, pValue) |
Agrega a la sentencia SQL la condición =. |
String pColumn: representa el identificador del campo del formulario
Tipo Object pValue: contiene el valor que se compara para el campo contenido en pColumn |
addConditionEquals(pIterativeName, pColumn, pValue) |
Agrega a la sentencia SQL la condición =. |
String pIterativeName: indica el identificador del iterativo al cual pertenece el campo indicado en pColumn
String pColumn: representa el identificador del campo del formulario
Tipo Object pValue: contiene el valor que se compara para el campo contenido en pColumn |
addConditionNotNull(pColumn) |
Agrega a la sentencia SQL la condición IS NOT NULL. |
String pColumn: representa el identificador del campo del formulario que se busca que no sea nulo |
addConditionNotNull(pIterativeName,pColumn) |
Agrega a la sentencia SQL la condición IS NOT NULL. |
String pIterativeName: indica el identificador del iterativo al cual pertenece el campo indicado en pColumn
String pColumn: representa el identificador del campo del formulario que se busca que no sea nulo |
addConditionNullable(pColumn) |
Agrega a la sentencia SQL la condición IS NULL. |
String pColumn: representa el identificador del campo del formulario que se busca que sea nulo |
addConditionNullable(pIterativeName,pColumn) |
Agrega a la sentencia SQL la condición IS NULL. |
String pIterativeName: indica el identificador del iterativo al cual pertenece el campo indicado en pColumn
String pColumn: representa el identificador del campo del formulario que se busca que sea nulo |
addConditionNOTIN( pColumn, pValues) |
Agrega a la sentencia SQL la condición NOT IN. |
String pColumn: representa el identificador del campo del formulario
List pValues: Este parámetro es una lista de valores (List) que serán usados en la cláusula NOT IN de la sentencia SQL. Cada valor en esta lista representa un valor que debe ser excluido de los resultados |
addConditionNOTIN(pIterativeName, pColumn, pValues) |
Agrega a la sentencia SQL la condición NOT IN. |
String pIterativeName: indica el identificador del iterativo al cual pertenece el campo indicado en pColumn
String pColumn: representa el identificador del campo del formulario
List pValues: Este parámetro es una lista de valores (List) que serán usados en la cláusula NOT IN de la sentencia SQL. Cada valor en esta lista representa un valor que debe ser excluido de los resultados |
addConditionIN(pColumn, pValues) |
Agrega a la sentencia SQL la condición IN.
|
String pColumn: representa el identificador del campo del formulario
List pValues: Este parámetro es una lista de valores (List) que serán usados en la cláusula IN de la sentencia SQL. Cada valor en esta lista representa un valor que debe ser incluido en los resultados |
addConditionIN(pIterativeName, pColumn, pValues) |
Agrega a la sentencia SQL la condición IN. |
String pIterativeName: indica el identificador del iterativo al cual pertenece el campo indicado en pColumn
String pColumn: representa el identificador del campo del formulario
List pValues: Este parámetro es una lista de valores (List) que serán usados en la cláusula IN de la sentencia SQL. Cada valor en esta lista representa un valor que debe ser incluido en los resultados |
addJOIN(pColumn, pObjectRelation, pKeyObjectRelation) |
Agrega la cláusula INNER JOIN a la sentencia SQL. Se realiza JOIN en donde el campo pColumn sea igual al campo pKeyObjectRelation del objeto pObjectRelation. |
String pColumn: representa el identificador del campo del formulario con el que se busca el JOIN asociado al campo representado por el campo pKeyObjectRelation del objeto pObjectRelation
Tipo objeto pObjectRelation: representa el objeto modelo sobre el cual se ejecuta un INNER JOIN
String pKeyObjectRelation: representa el identificador del campo del formulario del objeto modelo pObjectRelation |
addSum(pColumn) |
Agrega la función SUM a la sentencia SQL. |
String pColumn: representa el identificador del campo del formulario sobre el que se realiza la función SUM |
addSum(pIterativeName, pColumn) |
Agrega la función SUM a la sentencia SQL. |
String pIterativeName: indica el identificador del iterativo al cual pertenece el campo indicado en pColumn
String pColumn: representa el identificador del campo del formulario sobre el que se realiza la función SUM |
addCount(pColumn) |
Agrega la función COUNT a la sentencia SQL. |
String pColumn: representa el identificador del campo del formulario sobre el que se realiza la función COUNT |
addCount(pIterativeName, pColumn) |
Agrega la función COUNT a la sentencia SQL. |
String pIterativeName: indica el identificador del iterativo al cual pertenece el campo indicado en pColumn
String pColumn: representa el identificador del campo del formulario sobre el que se realiza la función COUNT |
addAVG(pColumn) |
Agrega la función AVG a la sentencia SQL. |
String pColumn: representa el identificador del campo del formulario sobre el que se realiza la función AVG |
addAVG(pIterativeName, pColumn) |
Agrega la función AVG a la sentencia SQL. |
String pIterativeName: indica el identificador del iterativo al cual pertenece el campo indicado en pColumn
String pColumn: representa el identificador del campo del formulario sobre el que se realiza la función AVG |
Métodos para trabajar con el objeto QueryResult
Método |
Descripción |
Parámetros |
---|---|---|
getQueryResult(pColumn): List |
Devuelve una lista con los valores correspondientes al campo indicado por pColumn. |
String pColumn: representa el identificador del campo del formulario del que se desean obtener los valores recuperados |
getCountResult(pColumn):List |
Devuelve una lista con los resultados de las funciones COUNT para el campo indicado por pColumn. |
String pColumn: representa el identificador del campo del formulario para el cual se realizó el conteo |
getSumResult(pColumn): List |
Devuelve una lista con los resultados de las funciones SUM para el campo indicado por pColumn. |
String pColumn: representa el identificador del campo del formulario para el cual se realizó la suma |
getAVGResult(pColumn): List
|
Devuelve una lista con el promedio (AVG) correspondiente para el campo indicado en pColumn. |
String pColumn: representa el identificador del campo del formulario del cual se desean objtener las filas recuperadas |
getExistsMoreResults(): boolean |
Devuelve un valor booleano que indica si existen más resultados que cumplen con las condiciones de la sentencia SQL ejecutada y que pueden ser procesados. |
Método para ejecutar con el objeto Servicio de Formulario
Método |
Descripción |
Parámetros |
---|---|---|
executeQuery(formInstance, queryCriteria): QueryResult |
Ejecuta una sentencia SQL basada en los criterios especificados y devuelve un objeto QueryResult con los resultados correspondientes. |
formInstance: objeto del modelo de la entidad con el cual se está trabajando y sobre el que se ejecuta la sentencia SQL.
queryCriteria: objeto QueryCriteria que contiene la configuración de la sentencia SQL, configurada a través de los métodos disponibles en dicha clase. |
Ejemplos de Ejecución
1.Búsqueda
En este ejemplo, se recupera una lista de identificadores de cuentas con estado activo, donde el estado activo corresponde al código "1". Se define una cantidad de 15 registros por página de lectura y se especifica el número de páginas a recuperar. Los resultados se ordenan por nombre de la compañía en forma ascendente.
QueryCriteria xQueryCriteria = new QueryCriteria();
//Creación de objeto modelo Cuenta xCuenta = new Cuenta();
//Creación del servicio para la entidad CuentaService xCuentaService = new CuentaService(getApiClient());
//Selección del identificador como columna a recuperar List<String> xColumns = new ArrayList<>(); xColumns.add(Cuenta.getIdAccountQueryName());
//Configuración de la consulta para seleccionar las columnas especificadas xQueryCriteria.createSelect(xColumns);
//Agregar condiciones a la consulta xQueryCriteria.addConditionEquals(Cuenta.getCdStatusQueryName(), "1"); xQueryCriteria.addConditionLimits(15, 1); xQueryCriteria.addOrderCriteria(Cuenta.getDsCompanyQueryName(), false);
//Ejecución de la consulta y obtención de los resultados QueryResult xQueryResult = xCuentaService.executeQuery(xCuenta, xQueryCriteria); List instancesResult = xQueryResult.getQueryResult(Cuenta.getIdAccountQueryName());
|
2.Creación de la sentencia "SELECT"
Para crear una consulta, se pueden utilizar dos métodos que permiten incorporar al objeto QueryCriteria la sentencia SELECT correspondiente, junto con los campos a recuperar de la entidad.
Primer Método
createSelect(List<String> pColumns)
|
Este método incorpora al objeto QueryCriteria la sentencia “SELECT” y agrega a la misma cada uno de los campos de la entidad que se hayan añadido previamente a la lista pColumns. Cada campo agregado a la lista pColumns debe ser un campo que no pertenezca a iterativos.
List<String> xColumns = new ArrayList<>(); xColumns.add(Cuenta.getIdAccountQueryName());
//Creación de la sentencia SELECT con las columnas especificadas xQueryCriteria.createSelect(xColumns);
|
Segundo Método
|
Este método permite agregar al objeto QueryCriteria campos que pertenezcan a un contenedor iterativo de la entidad. Los campos que no pertenecen a iterativos deben incluirse en la lista pFilters, mientras que los campos pertenecientes a iterativos deben agregarse a una lista separada. Esta lista se debe luego añadir a una variable de tipo “HashMap”, utilizando como clave el identificador del iterativo al que pertenecen los campos.
Para trabajar con los campos del iterativo y agregarlos a la variable correspondiente, es necesario utilizar la clase del iterativo, que está incluida dentro del objeto modelo del formulario.
List<String> xColumns = new ArrayList<>(); xColumns.add(Cuenta.getIdAccountQueryName());
//Selección del campo dsEmail del contenedor iterativo eMailLine Map<String,List<String>> xMap = new HashMap<>(); List<String> xIterativeColumns = new ArrayList<>(); xIterativeColumns.add(Cuenta.EMailLine.getDsEmailQueryName()); xMap.put(Cuenta.getEMailLineQueryName(), xIterativeColumns);
//Creación del select xQueryCriteria.createSelectWithIterative(xColumns, xMap);
|
3.Límites de resultados
Al trabajar con consultas SQL en Deyel SDK, es importante tener en cuenta que existe un límite en la cantidad de resultados obtenidos. Este límite se puede ajustar mediante el siguiente método:
|
En este método, el primer parámetro, pPageNumber, indica el número de la página que se desea recuperar, mientras que el segundo parámetro, pPerPage, especifica el número máximo de registros por página.
En forma predeterminada, Deyel recupera hasta 100 registros por página, y el límite máximo de registros que se pueden recuperar por página es 10.000. Si se configura un valor superior, la ejecución de la consulta SQL fallará.
4.Condiciones de búsqueda
Al objeto QueryCriteria se le pueden agregar diversas condiciones de búsqueda para realizar consultas SQL.
En el siguiente ejemplo, se crea un objeto QueryCriteria y se definen diferentes condiciones de búsqueda utilizando los operadores "igual", "distinto", "mayor", "mayor igual", "menor", "menor igual", "entre", "like", "es nulo", "no es nulo", “está en” y “no está en” con el método addCondition correspondiente.
Para cada tipo de condición, se encuentran disponibles dos métodos:
•Método para campos pertenecientes a iterativos: Utilizado para agregar condiciones a campos que forman parte de un contenedor iterativo.
•Método para campos no pertenecientes a iterativos: Utilizado para agregar condiciones a campos que no forman parte de un contenedor iterativo.
Operador "Entre"
Métodos Disponibles:
|
|
Ejemplo para un campo no iterativo:
// Agrega una condición para que el campo qtAnualRev del formulario Cuenta esté entre los valores 500.000 // y 800.000 xQueryCriteria.addConditionBetween(Cuenta.getQtAnualRevQueryName(), 500000, 800000);
|
Ejemplo para un campo de iterativo:
// Agrega una condición para que el campo qtAmount del iterativo Producto del formulario Oportunidad esté // entre los valores 5.000 y 10.000 xQueryCriteria.addConditionBetween(Oportunidad.getProductoQueryName(), Oportunidad.Producto.getQtAmountQueryName(), 5000, 10000);
|
Operador "Mayor A", "Mayor o Igual A"
La distinción entre el uso del operador "mayor o igual" y el operador "mayor" se realiza a través del último parámetro del método correspondiente.
Los valores posibles para este parámetro son:
•True: Se utiliza el operador "mayor o igual" (>=).
•False: Se utiliza el operador "mayor" (>).
Métodos Disponibles:
|
|
Ejemplos para un campo no iterativo:
// Agrega una condición para que el campo qtAnualRev del formulario Cuenta sea mayor a 500.000 xQueryCriteria.addConditionGreater(Cuenta.getQtAnualRevQueryName(), 500000, false);
|
// Agrega una condición para que el campo qtAnualRev del formulario Cuenta sea mayor o igual a 500.000 xQueryCriteria.addConditionGreater(Cuenta.getQtAnualRevQueryName(), 500000, true);
|
Ejemplos para un campo de iterativo:
// Agrega una condición para que el campo qtAmount del iterativo Producto del formulario Oportunidad sea // mayor a 5.000 addConditionGreater(Oportunidad.getProductoQueryName(), Oportunidad.Producto.getQtAmountQueryName(), 5000, false);
|
// Agrega una condición para que el campo qtAmount del iterativo Producto del formulario Oportunidad sea // mayor o igual a 5.000 xQueryCriteria.addConditionGreater(Oportunidad.getProductoQueryName(), Oportunidad.Producto.getQtAmountQueryName(), 5000, true);
|
Operador “Menor A”, “Menor o Igual A”
La distinción entre el uso del operador "menor" y el operador "menor o igual" se realiza a través del último parámetro del método correspondiente. Los valores posibles para este parámetro son:
•True: Se utiliza el operador "menor o igual" (<=).
•False: Se utiliza el operador "menor" (<).
Métodos Disponibles:
|
|
Ejemplos para un campo no iterativo:
// Agrega una condición para que el campo qtAnualRev del formulario Cuenta sea menor a 500.000 xQueryCriteria.addConditionLower(Cuenta.getQtAnualRevQueryName(), 500000, false);
|
// Agrega una condición para que el campo qtAnualRev del formulario Cuenta sea menor o igual a 500.000 xQueryCriteria.addConditionLower(Cuenta.getQtAnualRevQueryName(), 500000, true);
|
Ejemplos para un campo de iterativo:
// Agrega una condición para que el campo qtAmount del iterativo Producto del formulario Oportunidad sea // menor a 5.000 xQueryCriteria.addConditionLower(Oportunidad.getProductoQueryName(), Oportunidad.Producto.getQtAmountQueryName(), 5000, false);
|
// Agrega una condición para que el campo qtAmount del iterativo Producto del formulario Oportunidad sea // menor o igual a 5.000 xQueryCriteria.addConditionLower(Oportunidad.getProductoQueryName(), Oportunidad.Producto.getQtAmountQueryName(), 5000, true);
|
Operador “Like”
Métodos Disponibles:
|
|
Para utilizar la condición “Like” en una consulta SQL, es necesario enviar el patrón de búsqueda completo como tipo String. Esto incluye los caracteres” %” que se usan como comodines en el patrón.
Ejemplo para un campo no iterativo:
// Campo no iterativo xQueryCriteria.addConditionLike(Cuenta.getDsCompanyQueryName(),"%ACME%");
|
Ejemplo para un campo de iterativo:
// Agrega una condición para que el campo dsEmail del iterativo eMailLine del formulario Cuenta cumpla // con el patrón '%@gmail.com%' xQueryCriteria.addConditionLike(Cuenta.getEMailLineQueryName(), Cuenta.EMailLine.getDsEmailQueryName(), "%@gmail.com%");
|
Operador “Distinto”
Métodos Disponibles:
|
|
Ejemplo para un campo no iterativo:
// Campo no iterativo xQueryCriteria.addConditionNotEquals(Cuenta.getDsCompanyQueryName(),"ACME");
|
Ejemplo para un campo de iterativo:
// Campo de iterativo // Agrega una condición para que el campo dsEmail del iterativo eMailLine del formulario Cuenta no sea // igual a "example@gmail.com" xQueryCriteria.addConditionNotEquals(Cuenta.getEMailLineQueryName(), Cuenta.EMailLine.getDsEmailQueryName(), "example@gmail.com"); |
Operador "Igual"
Métodos Disponibles:
addConditionEquals(String pColumnName, Object pValue)
|
|
Ejemplo para un campo no iterativo:
// Campo no iterativo xQueryCriteria.addConditionEquals(Cuenta.getDsCompanyQueryName(),"ACME");
|
Ejemplo para un campo de iterativo:
// Agrega una condición para que el campo dsEmail del iterativo eMailLine del formulario Cuenta sea igual // a "example@gmail.com" xQueryCriteria.addConditionEquals(Cuenta.getEMailLineQueryName(), Cuenta.EMailLine.getDsEmailQueryName(), "example@gmail.com");
|
Operador "No es Nulo"
Métodos Disponibles:
|
|
Ejemplo para un campo no iterativo:
// Campo no iterativo xQueryCriteria.addConditionNotNull(Cuenta.getCdStatusQueryName());
|
Ejemplo para un campo de iterativo:
// Campo de iterativo // nulo xQueryCriteria.addConditionNotNull(Cuenta.getEMailLineQueryName(), Cuenta.EMailLine.getDsEmailQueryName());
|
Operador "Es Nulo"
Métodos Disponibles:
|
|
Ejemplo para un campo no iterativo:
// Campo no iterativo xQueryCriteria.addConditionNullable(Cuenta.getCdStatusQueryName());
|
Ejemplo para un campo de iterativo:
// Campo de iterativo // sea nulo xQueryCriteria.addConditionNullable(Cuenta.getEMailLineQueryName(), Cuenta.EMailLine.getDsEmailQueryName());
|
Operador "Está En"
Métodos Disponibles:
|
|
Ejemplo para un campo no iterativo:
// Campo no iterativo // en xElements (4 y 6) List xElements = new ArrayList(); xElements.add(4); xElements.add(6); xQueryCriteria.addConditionIN(Cuenta.getDsIndustryQueryName(), xElements);
|
Ejemplo para un campo de iterativo:
// Campo de iterativo List xCountries = new ArrayList(); xCountries.add("Argentina"); // Crea una nueva instancia de QueryCriteria para agregar la condición xQueryCriteria = new QueryCriteria(); // Agrega la condición que filtra el campo dsCountry del iterativo LsAddress del formulario Cuenta // esté en el conjunto de valores incluídos en xCountries. En este caso, Argentina. xQueryCriteria.addConditionIN(Cuenta.getLsAddressQueryName(), Cuenta.LsAddress.getDsCountryQueryName(), xCountries);
|
Operador "No Está En"
Métodos Disponibles:
|
|
Ejemplo para un campo no iterativo:
// Campo no iterativo // en xElements (4 y 6) List xElements = new ArrayList(); xElements.add(4); xElements.add(6); xQueryCriteria.addConditionNOTIN(Cuenta.getDsIndustryQueryName(), xElements);
|
Ejemplo para un campo de iterativo:
// Campo de iterativo List xCountries = new ArrayList(); xCountries.add("Argentina"); // Crea una nueva instancia de QueryCriteria para agregar la condición xQueryCriteria = new QueryCriteria(); // Agregado de condición para verificar que el campo dsCountry del iterativo LsAddress del formulario Cuenta // no esté en el conjunto de valores incluidos en xCountries. En este caso, Argentina. xQueryCriteria.addConditionNOTIN(Cuenta.getLsAddressQueryName(), Cuenta.LsAddress.getDsCountryQueryName(), xCountries);
|
5.Agrupamiento
El uso de la agrupación es útil cuando se desea combinar los resultados con funciones como, por ejemplo, COUNT o SUM. Permite agrupar los resultados recuperados según el campo o columna que se indique.
Métodos Disponibles:
|
|
Ejemplo para un campo no iterativo:
// Campo no iterativo xQueryCriteria.addGroupBy(Cuenta.getCdStatusQueryName());
|
Ejemplo para un campo de iterativo:
// Agrupa por el campo dsCountry del iterativo lsAddress del formulario Cuenta xQueryCriteria.addGroupBy(Cuenta.getLsAddressQueryName(), Cuenta.LsAddress.getDsCountryQueryName());
|
6.Ordenamiento
Se puede agregar un criterio de ordenamiento a los resultados de las consultas, ya sea en orden ascendente o descendente. Este criterio se indica mediante un valor booleano en el último parámetro de los métodos disponibles. Los valores posibles son:
•True: Utiliza el orden descendente.
•False: Utiliza el orden ascendente.
Métodos Disponibles:
|
|
Ejemplo para un campo no iterativo:
// Campo no iterativo xQueryCriteria.addOrderCriteria(Cuenta.getQtAnualRevQueryName());
|
Ejemplo para un campo de iterativo:
// Ordena por el campo dsCountry del iterativo lsAddress del formulario Cuenta en orden ascendente xQueryCriteria.addOrderCriteria(Cuenta.getLsAddressQueryName(), Cuenta.LsAddress.getDsCountryQueryName(), true);
|
7.Funciones de agregación
Al objeto QueryCriteria, se le pueden agregar funciones de agregación, tales como COUNT, SUM o AVG. Estas funciones deben aplicarse antes de utilizar los métodos createSelect o createSelectWithIterative.
Función “Count”
Métodos Disponibles:
|
addCount(String pIterativeName, String pColumnName)
|
Ejemplo para un campo no iterativo:
// Campo no iterativo // para determinar la cantidad de cuentas agrupadas por estado QueryCriteria xQueryCriteria = new QueryCriteria(); List<String> xList = new ArrayList<>();
xList.add(Cuenta.getCdStatusQueryName()); xQueryCriteria.createSelect(xList); xQueryCriteria.addGroupBy(Cuenta.getCdStatusQueryName());
|
Función “SUM”
Métodos Disponibles:
addSum(String pColumnName)
|
addSum(String pIterativeName, String pColumnName)
|
Ejemplo para un campo no iterativo:
// Campo no iterativo // determinar la suma de las ganancias anuales de todas las cuentas QueryCriteria xQueryCriteria = new QueryCriteria(); xQueryCriteria.addSum(Cuenta.getQtAnualRevQueryName()); xQueryCriteria.createSelect(new ArrayList());
|
Función “AVG”
Métodos Disponibles:
addAVG(String pColumnName)
|
addAVG(String pIterativeName, String pColumnName)
|
Ejemplo para un campo no iterativo:
// Campo no iterativo // el promedio de las ganancias anuales de todas las cuentas. QueryCriteria xQueryCriteria = new QueryCriteria(); String xQTANUALREV = Cuenta.getQtAnualRevQueryName(); xQueryCriteria.addAVG(xQTANUALREV); xQueryCriteria.createSelect(new ArrayList<>()); xQueryResult = xCuentaService.executeQuery(new Cuenta(), xQueryCriteria);
|
Ejemplo para un campo iterativo:
// Campo iterativo xQueryCriteria = new QueryCriteria(); NotadeVentaService xNotaDeVentaService = new NotadeVentaService(getApiClient()); String xPrecioDeVenta = NotadeVenta.Items.getQtSalesPriceQueryName(); xQueryCriteria.addAVG(NotadeVenta.getItemsQueryName(), xPrecioDeVenta); xQueryCriteria.addConditionEquals(NotadeVenta.getDsNumberQueryName(),1); HashMap<String, List<String>> xMap = new HashMap<>(); xMap.put(NotadeVenta.getItemsQueryName(), new ArrayList<>()); xQueryCriteria.createSelectWithIterative(new ArrayList<>(), xMap); xQueryResult = xNotaDeVentaService.executeQuery(new NotadeVenta(), xQueryCriteria); xAVGList = xQueryResult.getAVGResult(xPrecioDeVenta);
|
8.Join entre entidades
Método Disponible:
|
A continuación se muestra un ejemplo que obtiene el nombre de todas las cuentas y los tickets asociados a cada una de ellas. De cada ticket, se recupera el ID y el título del mismo.
QueryCriteria xQueryCriteria = new QueryCriteria();
// Crea una lista de campos a seleccionar List xList = new ArrayList<>();
// Crea instancias de las entidades Cuenta xCuenta = new Cuenta(); Ticket xTicket = new Ticket();
// Crea una instancia del servicio de Cuenta con el cliente de API CuentaService xCuentaService = new CuentaService(getApiClient());
// Agrega los nombres de los campos a la lista de selección xList.add(Ticket.getIdTicketQueryName()); xList.add(Ticket.getDsTitleQueryName()); xList.add(Cuenta.getDsCompanyQueryName());
// Crea la selección con los campos especificados xQueryCriteria.createSelect(xList);
// Agrega el JOIN entre Cuenta y Ticket xQueryCriteria.addJOIN(Cuenta.getIdAccountQueryName(),// Campo de unión en Cuenta xTicket, // Objeto Ticket (relación con el Ticket) Ticket.getIdTicketAccountQueryName() // Campo de unión en Ticket );
// Ejecutar la consulta utilizando el servicio de Cuenta QueryResult xQueryResult = xCuentaService.executeQuery(xCuenta, xQueryCriteria); // Obtener los resultados de la consulta List <String> xTicketIds = xQueryResult.getQueryResult(Ticket.getIdTicketQueryName()); List <String> xTicketTitles = xQueryResult.getQueryResult(Ticket.getDsTitleQueryName()); List <String> xComapanyNames = xQueryResult.getQueryResult(Cuenta.getDsCompanyQueryName());
// Itera sobre los resultados y registra la información for (int i = 0; i < xTicketIds.size(); i++) { log("Cuenta : " + xComapanyNames.get(i) + ". Ticket número: " + xTicketIds.get(i) + ". Título: " + xTicketTitles.get(i)); }
|
9.Operar sobre los resultados
Una vez que se ejecuta una consulta SQL, el objeto QueryResult contiene los resultados agrupados por columna recuperada (campo de entidad). Para interactuar con estos resultados, se pueden utilizar los siguientes métodos:
Primer Método: Recupera los resultados para una columna específica de la consulta SQL.
|
Este método permite recuperar los resultados para una columna específica de la consulta SQL. Recibe el nombre del campo del cual se desea obtener los resultados y devuelve una lista que contiene los valores correspondientes a esa columna para cada fila recuperada en la consulta.
// Crea una instancia del objeto QueryCriteria para definir los criterios de la consulta QueryCriteria xQueryCriteria = new QueryCriteria();
// Crea una instancia del servicio para ejecutar la consulta CuentaService xCuentaService = new CuentaService(getApiClient());
// Crea una instancia de la entidad Cuenta Cuenta xCuenta = new Cuenta();
// Define las columnas que se desean recuperar List xList = new ArrayList <> (); xList.add(Cuenta.getDsCompanyQueryName()); // Agrega el campo de la razón social a la lista de selección
// Configura los criterios de selección de la consulta xQueryCriteria.createSelect(xList);
// Agrega una condición para filtrar cuentas cuyo estado sea "1" xQueryCriteria.addConditionEquals(Cuenta.getCdStatusQueryName(), "1");
// Ejecuta la consulta y obtiene los resultados QueryResult xQueryResult = xCuentaService.executeQuery( xCuenta, xQueryCriteria);
// Recupera la lista de razones sociales desde los resultados de la consulta List xRazonSocialResults = xQueryResult.getQueryResult(Cuenta.getDsCompanyQueryName());
|
Como se puede observar en la última línea del ejemplo se obtienen los resultados para el campo requerido. El tamaño de la lista de los mismos se corresponde con la cantidad de filas que han cumplido con la consulta SQL
Si en la generación de la consulta SQL se seleccionaron más de un campo a recuperar, el tamaño de las listas correspondientes siempre será igual para cada campo. Si, por ejemplo, en la sentencia “SELECT” además de recuperar el campo dsCompany, se agrega que se desea recuperar datos del campo qtAnualRev, se debe pedir al objeto QueryResult los resultados para cada uno de estos campos.
Para operar sobre cada uno de los elementos de la lista, se puede usar una estructura que permite iterar sobre los elementos. Por ejemplo, usando un bucle for:
log("Razón social de cuenta: " + xRazonSocialResults.get(i) + ". Ganancias anuales: " + xQtAnualRevResults.get(i)); }
|
Como se puede ver, los tamaños de las listas se corresponden. Por lo tanto, si se seleccionan varios campos, basta con generar un solo iterador y obtener cada dato necesario. Los mismos corresponden a cada fila recuperada de la base de datos.
Segundo Método: Recupera los resultados de la función "COUNT" para una columna específica.
getCountResult(String pColumn): List
|
Este método debe recibir el nombre del campo sobre el cual se realizó el conteo. Por ejemplo:
|
Se devuelve una lista, ya que en una sentencia SQL puede haber más de una función COUNT. Se itera de la misma forma que en el ejemplo del primer método.
Tercer Método: Recupera los resultados de la función "SUM" para una columna específica.
|
De manera similar a la función COUNT, para obtener los resultados de la función SUM, el método debe recibir el nombre del campo sobre el cual se realizó la suma. Por ejemplo:
|
Se devuelve una lista dado que en una sentencia SQL puede haber más de una función SUM. Se itera de la misma forma que en el ejemplo del primer método.
Cuarto Método: Recupera el resultado de la función "AVG".
|
Al igual que con las funciones COUNT y SUM, para obtener los resultados de la función AVG, el método debe recibir el nombre del campo sobre el que se aplicó la función AVG
Por ejemplo:
|
Se devuelve una lista, y si esta no está vacía, el resultado de la función AVG aplicada se obtiene de la posición 0 de la lista.
Quinto Método: Comprueba si hay más resultados que no han sido devueltos debido a los límites establecidos.
|
Este método es fundamental para comprobar si existen más resultados para la consulta SQL generada que no han sido devueltos debido a los límites establecidos, ya sea por valores predeterminados o configurados por el usuario.
Si se realiza una consulta que tiene más de 10,000 registros recuperados, la manera de iterar sobre ellos se muestra en el siguiente ejemplo:
// Se dispone de más de 10.000 cuentas que cumplen con la condición de estado igual a “1” // Recuperar razón social de las cuentas cuyo estado sea “1”
QueryCriteria xQueryCriteria = new QueryCriteria(); CuentaService xCuentaService = new CuentaService(getApiClient()); Cuenta xCuenta = new Cuenta();
List xList = new ArrayList(); xList.add(Cuenta.getDsCompanyQueryName()); xQueryCriteria.createSelect(xList); xQueryCriteria.addConditionEquals(Cuenta.getCdStatusQueryName(), "1");
boolean hayMas = true; int page = 1; //página 1 int perPage = 10000; //10.000 registros por página
while(hayMas){ xQueryCriteria.addConditionLimits(page, perPage); QueryResult xQueryResult = xCuentaService.executeQuery( xCuenta, xQueryCriteria); List xRazonSocialResults = xQueryResult.getQueryResult(Cuenta.getDsCompanyQueryName());
for(int i=0; i < xRazonSocialResults.size(); i++){ log("Razón social de cuenta: " + xRazonSocialResults.get(i)); } hayMas = xQueryResult.getExistsMoreResults(); if(hayMas) { page++; } }
|
Se establecen 10,000 registros a recuperar por página, se itera sobre la página número 1, se obtienen los datos correspondientes, y se consulta al objeto QueryResult si existen resultados pendientes. Si es así, se incrementa el número de la página para obtener los resultados de la siguiente página.