我们如何使用自定义SQL通过自定义查找程序获取liferay实体?
以下是我用default.xml
编写的sql查询(我已经将查询减少到最低限度,因此逻辑仍然很简单。因为它包含了一些函数和连接,所以我们无法'使用DynamicQuery
API ):
SELECT
grp.*
FROM
Group_
WHERE
site = 1
AND active_ = 1
AND type_ <> 3
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);
}
上面的代码无效,因为GroupImpl
中存在portal-impl.jar
类,并且此jar不能用于自定义portlet。
我也尝试使用sqlQuery.addEntity("Group_", PortalClassLoaderUtil.getClassLoader().loadClass("com.liferay.portal.model.impl.GroupImpl"))
但是上面的代码引发了异常:
com.liferay.portal.kernel.exception.SystemException:
com.liferay.portal.kernel.dao.orm.ORMException:
org.hibernate.MappingException:
Unknown entity: com.liferay.portal.model.impl.GroupImpl
但是如果我们写sqlQuery.addEntity("MyCustomGroup", MyCustomGroupImpl.class);
,那么相同的代码适用于我们的自定义实体。
由于
答案 0 :(得分:8)
我从liferay forum thread发现了session = openSession();
而不是liferaySessionFactory
我们需要从// 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);
}
获取会话,如下所示:
{{1}}
希望这能帮助有关stackoverflow的人,我也找到了一个关于custom-sql的好tutorial,它也采用了相同的方法。