Liferay define una serie de procedimientos (API) para obtener datos de la base de datos. Liferay Dynamic es una de ellos. Esta forma puede añadir complejidad a las búsquedas que hagamos en la base de datos respecto a las finders que podemos encontrar en los servicios locales de las entidades.
Unos casos de uso (especificados por el equipo de Liferay) pueden ser los siguientes:
- Hacer agregados como MAX, MIN y AVG entre otros.
- Necesitas ciertas columnas en vez de objetos tipificados.
- Añadir complejidad con OR/AND.
- Otros.
Con un ejemplo se ve mejor: disponemos de una entidad Proyecto creada con el Service Builder de Liferay. Tenemos un campo fecha de creación (creation_date) y queremos encontrar los proyectos creados en un mes especificado. Necesitaremos una query que haga la siguiente acción:
SELECT *
FROM Proyecto
WHERE [date_ini] <= creation_date
AND creation_date <= [date_fin]
Al no poder realizarla con los finders de la entidad, tenemos que buscar una alternativa. Como las custom sql o las Dynamic Query. Aqui tenéis un ejemplo:
/*
* Creamos un objeto dynamicQuery para la clase Proyecto (que hemos generado)
* Si la Dynamic Query fuera sobre una clase propia de Liferay (User por ejemplo) se debería
* añadir el campo PortalClassLoaderUtil.getClassLoader()
*/
DynamicQuery dynamicQuery = DynamicQueryFactoryUtil.forClass(Proyecto.class);
Ahora podemos realizar 2 acciones:
- Añadir criterios de búsqueda.
- Añadir criterios de ordenación.
Criterios de búsqueda
Aqui tenemos que crear objetos con la Factoria RestrictionsFactoryUtil, que nos devuelve objetos de tipo Criterion. Esto nos sirve para construir lógicas como las siguientes:
- ilike eq (igual)
- gt (más grande estricto)
- ge (más grande o igual)
- métodos AND y OR
- etc
Criterios de ordenación
Aqui usaremos la factoria OrderFactoryUtil, que nos devuelve objetos de tipo Order. Aqui define dos métodos:
- Order asc(String nombrePropiedad)
- Order desc(String nombrePropiedad)
Una vez hechos los Criterios y las Ordenaciones se añaden al objeto dynamic query así de fàcil:
- dynamicQuery.add(criterio)
- dynamicQuery.addOrder(order)
Finalmente, solo nos faltará ejecutar la dynamic query, pero aqui volvemos al ejemplo con todo lo aprendido:
Criterion criterion1 = RestrictionsFactoryUtil.ge(“date_ini”, searchdate);
Criterion criterion2 = RestrictionsFactoryUtil.le(“date_fin”, searchdate);
Criterion criterion = RestrictionsFactoryUtil.and(criterion1, criterion2);
dynamicQuery.add(criterion);
List<proyecto> list = ProyectoLocalServiceUtil.dynamicQuery(dynamicQuery);
¡Espero que os sirva de ayuda!