Mucha gente tiene problemas para hacer peticiones a la base de datos desde Liferay, bien, usando la propia capa de servicio de Liferay o cuando creamos nuestros propios servicios vía Service Builder. Y es que en otra cosa no, pero en Liferay saben como adueñarse de librerías, mapearlas usando una API propia, y pasarlas como propias(En este caso Hibernate).
Vamos a ver como creamos peticiones de acceso a la base de datos:
Creación de una query dinámica o DynamicQuery
Lo primero será crear nuestra propia query dinámica, que lo haremos de la manera siguiente:
ClassLoader cl = PortalClassLoaderUtil.getClassLoader(); DynamicQuery myQuery = DynamicQueryFactoryUtil.forClass(EntidadImpl.class,cl);
Donde ‘EntidadImpl’ es la implementación de nuestra entidad(User, Group, Site, etc.).
Condiciones a nuestra query
Ahora ya podemos poner condiciones a nuestra query. Por ejemplo:
/* Condiciones AND */ myQuery .add( PropertyFactoryUtil.forName("title").like( "%"+search+"%" ) ) .add( PropertyFactoryUtil.forName("userId").eq( userId ) ); /* Condiciones OR */ myQuery .add( RestrictionsFactoryUtil.disjunction() .add( PropertyFactoryUtil.forName("content").like( "%"+search+"%" ) ) .add( PropertyFactoryUtil.forName("showDate").le( new Date() ) ) );
Proyecciones
Si lo que queremos es que nos devuelvan uno o varias columnas concretas(No un objeto mapeado), como por ejemplo un campo fecha o un campo tipo el número de filas, tendremos que especificar que datos queremos mediante una proyección:
/* Devolver columna concreta */ .setProjection(ProjectionFactoryUtil.property("userId")); /* Devolver el número de filas */ myQuery.setProjection( ProjectionFactoryUtil.rowCount() );
Subquerys
Tal vez nos interese filtrar por una sub-petición, pues lo hacemos de la siguiente manera:
DynamicQuery subQuery = DynamicQueryFactoryUtil.forClass(OtraEntidadImpl.class,cl) .add( PropertyFactoryUtil.forName("userGroupId").eq( 8 ) ) .setProjection( ProjectionFactoryUtil.property("userId") ); myQuery=myQuery.add( PropertyFactoryUtil.forName("userId").in( subQuery ) );
Ordenaciones
Como no, ordenar nuestros resultados:
myQuery.addOrder( OrderFactoryUtil.desc("priority") );
Paginación
Si los datos se van a mostrar en un listado de una web, quizá nos interese poner paginación. Esto lo haremos mediante ‘Limit’:
myQuery.setLimit( rowfrom, rowto) ;
Recoger los datos
Y ya, después de 800 líneas, para obtener nuestros datos lo podemos hacer de la siguiente manera:
List<Entidad> ns=EntidadLocalServiceUtil.dynamicQuery( myQuery );
En fin, este post espero poder usarlo de chuleta para mi mismo y de documentación para formaciones, por ejemplo. Además, espero que os sirva a cada uno de [email protected] Un abrazo y hasta el próximo post.