Get it on Google Play
29-06-2018
 

Formación Liferay: Acceder a la base de datos

BBDD

BBDD

Liferay tiene una estupenda API para acceder a su base de datos, además tenemos Service Builder para crear nuestros propios servicios y abstraernos de saber como se hacen las peticiones o que base de datos se esta usando. Pero en ocasiones esto no es suficiente:

A veces necesitamos acceder directamente a la Base de datos de Liferay. Por ejemplo para optimizar consultas(Quieres filtrar por varias tablas), peticiones(Liferay no permite hacer UPDATES o DELETES en bloque) o mil cosas.

No es muy habitual y cuando necesito hacerlo siempre tengo que buscarlo. Este post es para alegrarme el día cuando necesito hacerlo o para mis formaciones:

Acceso mediante DynamicQuery

Los que hacéis proyectos con Hibernate estaréis acostumbrados a las DynamicQuerys. Básicamente construimos las peticiones a través de classes. Estas peticiones pueden devolver listas de Objetos de entidad, Objetos de Mapeos(java.util.Map) o Objetos de tipos(Long, Integer, String, etc.). Aquí algún ejemplo:

DynamicQuery events = DynamicQueryFactoryUtil.forClass( UserNotificationEvent.class )
		.add( PropertyFactoryUtil.forName("payload").like( "%\"notificationId\":"+notificationId+"%" ) )
		.add( PropertyFactoryUtil.forName("userId").eq( userId ) );

List<UserNotificationEvent.class> list=UserLocalServiceUtil.dynamicQuery( events );

Utilizar DynamicQuery crear peticiones que funcionan sobre cualquier base de datos(O casi, de vez en cuando te llevas algun susto, como cuando en Oracle no puedes meter mas de 1000 elementos dentro de un ‘in’).

Ejecutar sentencias SQL

Para los mas aguerridos podemos ejecutar sentencias SQL directamente sobre la base de datos(No apto para niños):

SessionFactory sessionFactory = (SessionFactory) PortalBeanLocatorUtil.locate("liferaySessionFactory");
Session session = null;
		
try {
	session = sessionFactory.openSession();     
            String sql="SELECT userId AS u FROM Users_UserGroups uug";
	SQLQuery sqlQuery = session.createSQLQuery( sql );

	List<Object> ul=sqlQuery.list();
} catch (Exception ex) { ex.printStackTrace(); } finally { sessionFactory.closeSession(session); }

Esta alternativa hace que nuestro código pueda no ser compatible con todas las bases de datos. Hay que tenerlo en cuenta.

Acceder directamente a la conexión JDBC

No se que tipo de cosas feas necesitáis hacer 😀 . Però también podéis tener acceso a la conexión JDBC mediante:

Connection con=DataAccess.getConnection();

Creo que no me he dejado ninguna alternativa. Como siempre espero que os resulte útil y ya sabéis “Manita arriba”, “Comentar” y “Compartir”. Además desde esta semana si valoráis el post podréis ver como están los datos de las valoraciones(Para curiosos, intrépidos y/o cotillas).

Buen fin de semana.

Si te ha servido, por favor comparte

Interesado en formación Liferay?

 

Leave a Reply