我想在MySQL数据库上执行一个查询,该数据库中有一个别名,所以我更喜欢动态查询方式。
我的问题是:
从LRCXCHTASK.JournalArticle中选择id_、groupId、articleId、urlTitle,其中version= (从LRCXCHTASK.JournalArticle ja选择max(ja.version),ja.articleId = LRCXCHTASK.JournalArticle.articleId );
为此,我编写了代码:
DynamicQuery articleSubDynamicQuery = DynamicQueryFactoryUtil.forClass(JournalArticle.class, "articleSub")
.add(PropertyFactoryUtil.forName("articleSub.articleId").eqProperty("articleParent.articleId"))
.setProjection(ProjectionFactoryUtil.max("articleSub.version"));
DynamicQuery articleParentDynamicQuery = DynamicQueryFactoryUtil.forClass(JournalArticle.class, "articleParent")
.add(PropertyFactoryUtil.forName("version").eq(articleSubDynamicQuery))
.setProjection(ProjectionFactoryUtil.property("id"))
.setProjection(ProjectionFactoryUtil.property("articleId"))
.setProjection(ProjectionFactoryUtil.property("groupId"))
.setProjection(ProjectionFactoryUtil.property("urlTitle"));
List<Object[]> journalArticleIdsList = JournalArticleLocalServiceUtil.dynamicQuery(articleParentDynamicQuery);我想要list,但它会引发classNotFound JournalArticleImpl异常
如果我用
DynamicQuery articleSubDynamicQuery2=JournalArticleLocalServiceUtil.dynamicQuery();
没有类加载程序问题,但是使用此方法,我无法在表上设置别名,这是执行查询所必需的。
发布于 2019-09-19 08:54:13
由于Liferay7.xOSGI模块化,如果使用java.lang.ClassNotFoundException: com.liferay.journal.model.impl.JournalArticleImpl,则会抛出一个JournalArticle,因为JournalArticle类位于公共API模块中,而JournalArticleImpl类位于私有的Impl模块中,因此hibernate代码无法找到该类。
如果使用Liferay服务提供的dynamicQuery方法,您就不会遇到这个问题,因为它的实现与JournalArticleImpl在同一个类加载器中。
尝试将DynamicQueryFactoryUtil.forClass({className}.class)替换为
{className}LocalServiceUtil.dynamicQuery()这将避免类加载器问题。
如果是DynamicQueryFactoryUtil.forClass(JournalArticle.class,,则替换JournalArticle .)与: JournalArticleLocalServiceUtil.dynamicQuery()
更多信息见Liferay论坛:
https://stackoverflow.com/questions/58005486
复制相似问题