3

I want to execute a query on MySQL database which has alias in it in liferay 7.1 so i prefer a way of dynamicquery

my query:

SELECT id_, groupId, articleId, urlTitle FROM LRCXCHTASK.JournalArticle where version= (select max(ja.version) from LRCXCHTASK.JournalArticle ja where ja.articleId = LRCXCHTASK.JournalArticle.articleId );

for this i have done code :

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);

I want list, but it throws classNotFound JournalArticleImpl exception

If i use

DynamicQuery articleSubDynamicQuery2=JournalArticleLocalServiceUtil.dynamicQuery();

there is no classloader issues but using this method i can not set alias on table which is mandatory to execute my query

1 Answers1

0

Due to Liferay 7.x OSGI modularization, a java.lang.ClassNotFoundException: com.liferay.journal.model.impl.JournalArticleImpl is thrown in case you use DynamicQueryFactoryUtil because JournalArticle class is in public API module, but JournalArticleImpl class is in private Impl module, so hibernate code is not able to find that class.

If you use dynamicQuery method provided by Liferay services, you won't have that problem as its implementation is in same classloader than JournalArticleImpl.

Try replacing DynamicQueryFactoryUtil.forClass({className}.class) with

{className}LocalServiceUtil.dynamicQuery()

That will avoid classloader issues

In case of JournalArticle, replace DynamicQueryFactoryUtil.forClass(JournalArticle.class, ....) with: JournalArticleLocalServiceUtil.dynamicQuery()

More info see Liferay forums:

jorgediaz-lr
  • 942
  • 6
  • 13
  • 1
    If i use DynamicQuery articleSubDynamicQuery2=JournalArticleLocalServiceUtil.dynamicQuery(); there is no classloader issues but using this method i can not set alias on table which is mandatory to execute my query – Murtaza Haamid Sep 19 '19 at 09:20