Есть ли способ установить псевдоним для таблицы в DynamicQuery в liferay 7.1 - PullRequest
3 голосов
/ 19 сентября 2019

Я хочу выполнить запрос к базе данных MySQL с псевдонимом в liferay 7.1, поэтому я предпочитаю способ динамического запроса

мой запрос:

SELECT id_, groupId,articleId, urlTitle ИЗ LRCXCHTASK.JournalArticle, где version = (выберите max (ja.version) из LRCXCHTASK.JournalArticle ja, где 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 ();

нет проблем с загрузчиком классов, но с помощью этого метода я не могу установить псевдоним для таблицы, которая является обязательной для выполнения моего запроса

1 Ответ

0 голосов
/ 19 сентября 2019

В связи с модульностью OSGI Liferay 7.x, java.lang.ClassNotFoundException: com.liferay.journal.model.impl.JournalArticleImpl выбрасывается в случае использования DynamicQueryFactoryUtil , поскольку JournalArticle класс находится в открытом модуле API, но JournalArticleImpl класс находится в закрытом модуле Impl, поэтому код hibernate не может найти этот класс.

Если вы используете dynamicQueryметод, предоставляемый сервисами Liferay, у вас не возникнет этой проблемы, поскольку его реализация находится в том же загрузчике классов, что и JournalArticleImpl.

Попробуйте заменить DynamicQueryFactoryUtil.forClass ({className} .class) на

{className}LocalServiceUtil.dynamicQuery()

Это позволит избежать проблем с загрузчиком классов

В случае JournalArticle замените DynamicQueryFactoryUtil.forClass (JournalArticle.class, ....) на: JournalArticleLocalServiceUtil.dynamicQuery ()

Больше информации смотрите на форумах Liferay:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...