sql service liferay liferay-6 builder

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?

  1. 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 usar DynamicQuery API ):

    SELECT grp.* FROM Group_ WHERE site = 1 AND active_ = 1 AND type_ <> 3

  2. 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