Get it on Google Play
Mas de 21 años en el mundo del IT corporativo

Formación Liferay Avanzado: Querys con Hibernate y Service Builder

04-11-2019
Liferay Service Builder Query

Liferay Service Builder Query

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.

Si te ha servido, por favor comparte

Interesado en formación Liferay?

 

Leave a Reply