使用Liferay的DynamicQuery按另一个表排序

时间:2012-07-19 10:50:38

标签: java liferay liferay-6 dynamicquery

我在Liferay 6中制作动态查询时遇到问题。我正在尝试根据JournalArticles进行查询以订阅view count。视图计数在另一个表(AssetEntry)中指定。

我坚持这个:

DynamicQuery query = DynamicQueryFactoryUtil.forClass(
JournalArticle.class, "articleParent", PortalClassLoaderUtil.getClassLoader());

//adding criterions
query.add(...);

DynamicQuery dq0 = DynamicQueryFactoryUtil.forClass(AssetEntry.class, "asset", 
PortalClassLoaderUtil.getClassLoader())
.setProjection(ProjectionFactoryUtil.property("asset.classPK"))
.add(PropertyFactoryUtil.forName("asset.companyId")
.eqProperty("articleParent.companyId"))
.add(PropertyFactoryUtil.forName("asset.groupId")
.eqProperty("articleParent.groupId"));

query.add(PropertyFactoryUtil.forName("articleParent.resourcePrimKey").in(dq0))
            .addOrder(OrderFactoryUtil.desc("asset.viewCount"));

有了这个,我收到一条错误消息:could not resolve property: asset of: com.liferay.portlet.journal.model.impl.JournalArticleImpl

如果我删除addOrder - 调用,则此错误消失。我应该如何添加order语句,以便主查询知道asset.viewCount

3 个答案:

答案 0 :(得分:1)

AssetEntryQuery assetEntryQuery = new AssetEntryQuery();
assetEntryQuery.setClassName(JournalArticle.class.getName());
assetEntryQuery.setXXX //adding criterions
assetEntryQuery.setOrderByCol1("viewCount");
List<AssetEntry> assetEntries = AssetEntryServiceUtil.getEntries(assetEntryQuery);

答案 1 :(得分:0)

我担心没有直接的方法可以使用DynamicQuery API。

我认为您需要使用Service builder Finders,即Custom Query与服务构建器。

答案 2 :(得分:0)

您无法使用动态查询,因为没有从JournalArticle实体直接引用到AssetEntry实体。

一种可能性是从AssetEntry表中检索有序的文章ID(基本上是你的dq0),然后再做另一个查询并以编程方式进行排序(你已经订购了id)。

最后我认为这一行

query.add(PropertyFactoryUtil.forName("articleParent.resourcePrimKey").in(dq0))

不符合您的想法。 resoucePrimKey是对资源表的权限引用。您需要使用id列。