<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <title>Liferay 7.2 - How to dynamicQuery with expandoBridge?</title>
  <link rel="self" href="https://liferay.dev/c/message_boards/find_thread?p_l_id=119785294&amp;threadId=117411950" />
  <subtitle>Liferay 7.2 - How to dynamicQuery with expandoBridge?</subtitle>
  <id>https://liferay.dev/c/message_boards/find_thread?p_l_id=119785294&amp;threadId=117411950</id>
  <updated>2026-04-04T21:21:03Z</updated>
  <dc:date>2026-04-04T21:21:03Z</dc:date>
  <entry>
    <title>RE: Liferay 7.2 - How to dynamicQuery with expandoBridge?</title>
    <link rel="alternate" href="https://liferay.dev/c/message_boards/find_message?p_l_id=119785294&amp;messageId=118406228" />
    <author>
      <name>David H Nebinger</name>
    </author>
    <id>https://liferay.dev/c/message_boards/find_message?p_l_id=119785294&amp;messageId=118406228</id>
    <updated>2020-02-03T13:54:05Z</updated>
    <published>2020-02-03T13:54:05Z</published>
    <summary type="html">Mixed class loaders is not going to work. After all, they are mixed class loaders...&lt;br /&gt;&lt;br /&gt;I wouldn&amp;#39;t be trying to solve this kind of thing with DQ as things get either prohibitively hard or impossible.&lt;br /&gt;&lt;br /&gt;For something like this I&amp;#39;d be using a custom SQL statement to handle the table joins and get results, followed by a normal entity retrieve to get the entities.</summary>
    <dc:creator>David H Nebinger</dc:creator>
    <dc:date>2020-02-03T13:54:05Z</dc:date>
  </entry>
  <entry>
    <title>RE: Liferay 7.2 - How to dynamicQuery with expandoBridge?</title>
    <link rel="alternate" href="https://liferay.dev/c/message_boards/find_message?p_l_id=119785294&amp;messageId=118405877" />
    <author>
      <name>Julien Feyen</name>
    </author>
    <id>https://liferay.dev/c/message_boards/find_message?p_l_id=119785294&amp;messageId=118405877</id>
    <updated>2020-02-03T13:28:44Z</updated>
    <published>2020-02-03T13:28:44Z</published>
    <summary type="html">Thanks for your reply and for explaining why we are getting the &amp;#39;Unknown entity&amp;#39; mapping exception for the ExpandoValue.&lt;br /&gt;I am new to the OSGi world much like many that are upgrading from Liferay 6.2, so please correct me if I am wrong. From my experience, the example provided by Fabio would have originally worked in 6.2, correct? It&amp;#39;s simply because of the class loaders required in the OSGi realm to make the associated connections.&lt;br /&gt;David, do you have an example as to how we may be able to get a mixed class loader to work so that we could pass one DQ to the other effectively creating a join which would have the potential of being better for performance especially when dealing with large data sets and further filtering articles?</summary>
    <dc:creator>Julien Feyen</dc:creator>
    <dc:date>2020-02-03T13:28:44Z</dc:date>
  </entry>
  <entry>
    <title>RE: Liferay 7.2 - How to dynamicQuery with expandoBridge?</title>
    <link rel="alternate" href="https://liferay.dev/c/message_boards/find_message?p_l_id=119785294&amp;messageId=118399600" />
    <author>
      <name>David H Nebinger</name>
    </author>
    <id>https://liferay.dev/c/message_boards/find_message?p_l_id=119785294&amp;messageId=118399600</id>
    <updated>2020-01-31T23:03:23Z</updated>
    <published>2020-01-31T23:03:23Z</published>
    <summary type="html">A couple of things...&lt;br /&gt;&lt;br /&gt;First, Mohammed is right in that you shouldn&amp;#39;t use DynamicQueryFactoryUtil.forClass(). It is often to get the classloaders right.&lt;br /&gt;&lt;br /&gt;Second, Julien has the answer but doesn&amp;#39;t explain it, but it comes down to class loader again. You&amp;#39;re trying to use the class loader from the journal article bundle and pass in a DQ instance built from a different class loader (the ExpandoValue&amp;#39;s loader).&lt;br /&gt;&lt;br /&gt;So you&amp;#39;re trying to effectively do this across a bunch of different class loaders and, of course, one doesn&amp;#39;t know about the other so you get the unknown entity exception.&lt;br /&gt;&lt;br /&gt;Julien&amp;#39;s solution works because he&amp;#39;s getting the list of values and passes that list to the journal article&amp;#39;s DQ, effectively removing the need to have some kind of mixed class loader.</summary>
    <dc:creator>David H Nebinger</dc:creator>
    <dc:date>2020-01-31T23:03:23Z</dc:date>
  </entry>
  <entry>
    <title>RE: Liferay 7.2 - How to dynamicQuery with expandoBridge?</title>
    <link rel="alternate" href="https://liferay.dev/c/message_boards/find_message?p_l_id=119785294&amp;messageId=118396661" />
    <author>
      <name>Julien Feyen</name>
    </author>
    <id>https://liferay.dev/c/message_boards/find_message?p_l_id=119785294&amp;messageId=118396661</id>
    <updated>2020-01-31T20:28:55Z</updated>
    <published>2020-01-31T20:28:55Z</published>
    <summary type="html">&lt;html&gt;&lt;head&gt;&lt;/head&gt;&lt;body&gt;Hi Fabio,&lt;br&gt;&lt;br&gt;I was experiencing the same problem, running from your example provided but for another purpose. You first need to query the ExpandoValues in order to locate the Journal Articles' primary keys. You then pass in this list of keys to the final query to get your desired results.&lt;br&gt;&lt;br&gt;In order to get your example working, try the following:&lt;br&gt;&lt;br&gt;&lt;pre&gt;&lt;code&gt;DynamicQuery expandoTableDynamicQuery = DynamicQueryFactoryUtil.forClass(ExpandoTable.class, ExpandoTable.class.getClassLoader());
expandoTableDynamicQuery.add(PropertyFactoryUtil.forName("name").eq(ExpandoTableConstants.DEFAULT_TABLE_NAME));
expandoTableDynamicQuery.setProjection(ProjectionFactoryUtil.property("tableId"));

DynamicQuery expandoColumnDynamicQuery = DynamicQueryFactoryUtil.forClass(ExpandoColumn.class, ExpandoColumn.class.getClassLoader());
expandoColumnDynamicQuery.add(PropertyFactoryUtil.forName("tableId").in(expandoTableDynamicQuery));
expandoColumnDynamicQuery.add(PropertyFactoryUtil.forName("name").eq("contentDate"));
expandoColumnDynamicQuery.setProjection(ProjectionFactoryUtil.property("columnId"));

DynamicQuery expandoValueDynamicQuery = DynamicQueryFactoryUtil.forClass(ExpandoValue.class, ExpandoValue.class.getClassLoader());
expandoValueDynamicQuery.add(PropertyFactoryUtil.forName("columnId").in(expandoColumnDynamicQuery));
expandoValueDynamicQuery.add(PropertyFactoryUtil.forName("data").gt(getFilterDate(pageDate)));
expandoValueDynamicQuery.setProjection(ProjectionFactoryUtil.property("classPK"));
List&amp;lt;long&amp;gt; expandoValueDynamicQueryValues = ExpandoValueLocalServiceUtil.dynamicQuery(expandoValueDynamicQuery);

DynamicQuery articleDynamicQuery = JournalArticleLocalServiceUtil.dynamicQuery();
articleDynamicQuery.add(PropertyFactoryUtil.forName("id").in(expandoValueDynamicQueryValues));

List&amp;lt;journalarticle&amp;gt; articles = JournalArticleLocalServiceUtil.dynamicQuery(articleDynamicQuery);&amp;lt;/journalarticle&amp;gt;&amp;lt;/long&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;/body&gt;&lt;/html&gt;</summary>
    <dc:creator>Julien Feyen</dc:creator>
    <dc:date>2020-01-31T20:28:55Z</dc:date>
  </entry>
  <entry>
    <title>RE: Liferay 7.2 - How to dynamicQuery with expandoBridge?</title>
    <link rel="alternate" href="https://liferay.dev/c/message_boards/find_message?p_l_id=119785294&amp;messageId=117412936" />
    <author>
      <name>Fabio Carvalho</name>
    </author>
    <id>https://liferay.dev/c/message_boards/find_message?p_l_id=119785294&amp;messageId=117412936</id>
    <updated>2019-10-09T11:36:05Z</updated>
    <published>2019-10-09T11:36:05Z</published>
    <summary type="html">Hi Mohammed,&lt;br /&gt;&lt;br /&gt;I have tried that. It isn&amp;#39;t working either. Same error.</summary>
    <dc:creator>Fabio Carvalho</dc:creator>
    <dc:date>2019-10-09T11:36:05Z</dc:date>
  </entry>
  <entry>
    <title>RE: Liferay 7.2 - How to dynamicQuery with expandoBridge?</title>
    <link rel="alternate" href="https://liferay.dev/c/message_boards/find_message?p_l_id=119785294&amp;messageId=117413556" />
    <author>
      <name>Mohammed Yasin</name>
    </author>
    <id>https://liferay.dev/c/message_boards/find_message?p_l_id=119785294&amp;messageId=117413556</id>
    <updated>2019-10-09T11:32:00Z</updated>
    <published>2019-10-09T11:32:00Z</published>
    <summary type="html">&lt;html&gt;&lt;head&gt;&lt;/head&gt;&lt;body&gt;Hi,&lt;br&gt;Try using ExpandoValueLocalServiceUtil.dynamicQuery() or expandoValueLocalService.dynamicQuery()&amp;nbsp; &amp;nbsp;Instead of&amp;nbsp;DynamicQueryFactoryUtil&lt;br&gt;&lt;pre&gt;&lt;code&gt;DynamicQuery expandoValueDynamicQuery =&amp;amp;nbsp;&amp;amp;nbsp;ExpandoValueLocalServiceUtil.dynamicQuery() ;
&lt;/code&gt;&lt;/pre&gt;In the same way you can change for ExpandoColumn and ExpandoTable&lt;/body&gt;&lt;/html&gt;</summary>
    <dc:creator>Mohammed Yasin</dc:creator>
    <dc:date>2019-10-09T11:32:00Z</dc:date>
  </entry>
  <entry>
    <title>Liferay 7.2 - How to dynamicQuery with expandoBridge?</title>
    <link rel="alternate" href="https://liferay.dev/c/message_boards/find_message?p_l_id=119785294&amp;messageId=117411949" />
    <author>
      <name>Fabio Carvalho</name>
    </author>
    <id>https://liferay.dev/c/message_boards/find_message?p_l_id=119785294&amp;messageId=117411949</id>
    <updated>2019-10-09T10:37:19Z</updated>
    <published>2019-10-09T10:37:19Z</published>
    <summary type="html">&lt;html&gt;&lt;head&gt;&lt;/head&gt;&lt;body&gt;Hi,&lt;br&gt;I have set a custom field to my JournalArticle. Now, I want to query my JournalArticles based on this custom field. I am doing something like this:&lt;pre&gt;&lt;code&gt;DynamicQuery expandoTableDynamicQuery = DynamicQueryFactoryUtil.forClass(ExpandoTable.class, ExpandoTable.class.getClassLoader());
expandoTableDynamicQuery.add(PropertyFactoryUtil.forName("name").eq(ExpandoTableConstants.DEFAULT_TABLE_NAME));
expandoTableDynamicQuery.setProjection(ProjectionFactoryUtil.property("tableId"));
&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;
DynamicQuery expandoColumnDynamicQuery = DynamicQueryFactoryUtil.forClass(ExpandoColumn.class, ExpandoColumn.class.getClassLoader());
expandoColumnDynamicQuery.add(PropertyFactoryUtil.forName("tableId").in(expandoTableDynamicQuery));
expandoColumnDynamicQuery.add(PropertyFactoryUtil.forName("name").eq("contentDate"));
expandoColumnDynamicQuery.setProjection(ProjectionFactoryUtil.property("columnId"));
&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;
DynamicQuery expandoValueDynamicQuery = DynamicQueryFactoryUtil.forClass(ExpandoValue.class, ExpandoValue.class.getClassLoader());
expandoValueDynamicQuery.add(PropertyFactoryUtil.forName("columnId").in(expandoColumnDynamicQuery));
expandoValueDynamicQuery.add(PropertyFactoryUtil.forName("data").gt(getFilterDate(pageDate)));
expandoValueDynamicQuery.setProjection(ProjectionFactoryUtil.property("classPK"));
&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;
DynamicQuery articleDynamicQuery = JournalArticleLocalServiceUtil.dynamicQuery();
articleDynamicQuery.add(PropertyFactoryUtil.forName("id").in(expandoValueDynamicQuery));
​​​​​​​
List&amp;lt;journalarticle&amp;gt; articles = JournalArticleLocalServiceUtil.dynamicQuery(articleDynamicQuery);&amp;lt;/journalarticle&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;br&gt;But when I add the following line, I crash the query:&lt;pre&gt;&lt;code&gt;articleDynamicQuery.add(PropertyFactoryUtil.forName("id").in(expandoValueDynamicQuery));&lt;/code&gt;&lt;/pre&gt;&lt;br&gt;&lt;pre&gt;&lt;code&gt;org.hibernate.MappingException: Unknown entity: com.liferay.portlet.expando.model.impl.ExpandoValueImpl
&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;at org.hibernate.impl.SessionFactoryImpl.getEntityPersister(SessionFactoryImpl.java:693)
&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;at org.hibernate.criterion.SubqueryExpression.toSqlString(SubqueryExpression.java:66)
&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;at org.hibernate.loader.criteria.CriteriaQueryTranslator.getWhereCondition(CriteriaQueryTranslator.java:380)
&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;at org.hibernate.loader.criteria.CriteriaJoinWalker.&amp;lt;init&amp;gt;(CriteriaJoinWalker.java:113)
&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;at org.hibernate.loader.criteria.CriteriaJoinWalker.&amp;lt;init&amp;gt;(CriteriaJoinWalker.java:82)
&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;at org.hibernate.loader.criteria.CriteriaLoader.&amp;lt;init&amp;gt;(CriteriaLoader.java:92)
&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1697)
&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;at org.hibernate.impl.CriteriaImpl.list(CriteriaImpl.java:347)
&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;at com.liferay.portal.dao.orm.hibernate.DynamicQueryImpl.list(DynamicQueryImpl.java:140)
&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;at com.liferay.portal.dao.orm.hibernate.DynamicQueryImpl.list(DynamicQueryImpl.java:126)
&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;at com.liferay.portal.kernel.service.persistence.impl.BasePersistenceImpl.findWithDynamicQuery(BasePersistenceImpl.java:328)
&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;at com.liferay.journal.service.base.JournalArticleLocalServiceBaseImpl.dynamicQuery(JournalArticleLocalServiceBaseImpl.java:162)
&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;at com.liferay.portal.kernel.bean.ClassLoaderBeanHandler.invoke(ClassLoaderBeanHandler.java:66)
&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;at com.liferay.journal.service.JournalArticleLocalServiceWrapper.dynamicQuery(JournalArticleLocalServiceWrapper.java:781)
&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;at com.liferay.portal.kernel.bean.ClassLoaderBeanHandler.invoke(ClassLoaderBeanHandler.java:66)
&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;at com.liferay.portal.spring.aop.AopMethodInvocationImpl.proceed(AopMethodInvocationImpl.java:50)
&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;at com.liferay.portal.spring.transaction.TransactionInterceptor.lambda$invoke$0(TransactionInterceptor.java:64)
&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;at com.liferay.portal.spring.transaction.DefaultTransactionExecutor._execute(DefaultTransactionExecutor.java:128)
&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;at com.liferay.portal.spring.transaction.DefaultTransactionExecutor.execute(DefaultTransactionExecutor.java:51)
&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;at com.liferay.portal.spring.transaction.TransactionInterceptor.invoke(TransactionInterceptor.java:62)&amp;lt;/init&amp;gt;&amp;lt;/init&amp;gt;&amp;lt;/init&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;br&gt;Am I doing something wrong? What would be the correct way to do this?&lt;/body&gt;&lt;/html&gt;</summary>
    <dc:creator>Fabio Carvalho</dc:creator>
    <dc:date>2019-10-09T10:37:19Z</dc:date>
  </entry>
</feed>
