sql - ¿Cómo obtener entidad liferay a través de buscador personalizado en el portlet de complemento personalizado?
service liferay-6 (1)
Descubrí del hilo del foro liferay que en vez de session = openSession();
liferaySessionFactory
que recuperar la sesión de liferaySessionFactory
siguiente manera para que funcione:
// fetch liferay''s session factory
SessionFactory sessionFactory = (SessionFactory) PortalBeanLocatorUtil.locate("liferaySessionFactory");
Session session = null;
try {
// open session using liferay''s session factory
session = sessionFactory.openSession();
// fetches the query string from the default.xml
String sql = CustomSQLUtil.get(FIND_ONLY_ACTIVE_SITES);
SQLQuery sqlQuery = session.createSQLQuery(sql);
// use portal class loader, since this is portal entity
sqlQuery.addEntity("Group_", PortalClassLoaderUtil.getClassLoader().loadClass("com.liferay.portal.model.impl.GroupImpl"));
return (List<Group>) QueryUtil.list(sqlQuery, getDialect(), 0, QueryUtil.ALL_POS);
}
catch (Exception e) {
throw new SystemException(e);
}
finally {
sessionFactory.closeSession(session); // edited as per the comment on this answer
// closeSession(session);
}
Espero que esto ayude a alguien en stackoverflow, también encontré un buen tutorial sobre custom-sql que también usa el mismo enfoque.
¿Cómo podemos obtener entidades liferay a través del buscador personalizado utilizando SQL personalizado?
A continuación está mi consulta sql escrita en
default.xml
( he recortado la consulta al mínimo para que la lógica siga siendo simple. Dado que incluía algunas funciones y uniones no podíamos usarDynamicQuery
API ):SELECT grp.* FROM Group_ WHERE site = 1 AND active_ = 1 AND type_ <> 3
Código relevante en
MyCustomGroupFinderImpl.java
:Session session = null; try { session = openSession(); // fetches the query string from the default.xml String sql = CustomSQLUtil.get(FIND_ONLY_ACTIVE_SITES); SQLQuery sqlQuery = session.createSQLQuery(sql); sqlQuery.addEntity("Group_", GroupImpl.class); // sqlQuery.addEntity("Group_", PortalClassLoaderUtil.getClassLoader().loadClass("com.liferay.portal.model.impl.GroupImpl")); return (List<Group>) QueryUtil.list(sqlQuery, getDialect(), 0, QueryUtil.ALL_POS); } catch (Exception e) { throw new SystemException(e); } finally { closeSession(session); }
Este código anterior no funcionará ya que la clase GroupImpl
está presente en portal-impl.jar
y este jar no se puede usar en el portlet personalizado.
También intenté usar sqlQuery.addEntity("Group_", PortalClassLoaderUtil.getClassLoader().loadClass("com.liferay.portal.model.impl.GroupImpl"))
Pero este código anterior arroja una excepción:
com.liferay.portal.kernel.exception.SystemException:
com.liferay.portal.kernel.dao.orm.ORMException:
org.hibernate.MappingException:
Unknown entity: com.liferay.portal.model.impl.GroupImpl
Pero el mismo código funciona para nuestra entidad personalizada, si escribimos sqlQuery.addEntity("MyCustomGroup", MyCustomGroupImpl.class);
.
Gracias