首页 > 解决方案 > 有没有办法在 liferay 7.1 中为 DynamicQuery 中的表设置别名

问题描述

我想在 Liferay 7.1 中有别名的 MySQL 数据库上执行查询,所以我更喜欢动态查询的方式

我的查询:

SELECT id_, groupId, articleId, urlTitle FROM LRCXCHTASK.JournalArticle where version= (select max(ja.version) from LRCXCHTASK.JournalArticle ja where 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);

我想要列表,但它会抛出 classNotFound JournalArticleImpl 异常

如果我使用

DynamicQuery articleSubDynamicQuery2=JournalArticleLocalServiceUtil.dynamicQuery();

没有类加载器问题,但使用此方法我无法在表上设置别名,这是执行我的查询所必需的

标签: liferay-7

解决方案


由于 Liferay 7.x OSGI 模块化,如果您使用DynamicQueryFactoryUtil会抛出java.lang.ClassNotFoundException: com.liferay.journal.model.impl.JournalArticleImpl因为JournalArticle类在公共 API 模块中,但JournalArticleImpl类在私有 Impl 中模块,因此休眠代码无法找到该类。

如果你使用 Liferay 服务提供的 dynamicQuery 方法,你不会有这个问题,因为它的实现与 JournalArticleImpl 在同一个类加载器中。

尝试将DynamicQueryFactoryUtil.forClass({className}.class)替换为

{className}LocalServiceUtil.dynamicQuery()

这将避免类加载器问题

如果是 JournalArticle,请将 DynamicQueryFactoryUtil.forClass(JournalArticle.class, ....) 替换为: JournalArticleLocalServiceUtil.dynamicQuery()

更多信息请参见 Liferay 论坛:


推荐阅读