当我在Liferay6中进行动态查询时,我遇到了一个问题。我试图根据他们的view count对JournalArticles进行排序。视图计数在另一个表(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-call,此错误将消失。我应该如何添加order语句,以便主查询能够识别asset.viewCount
发布于 2012-07-19 21:44:16
AssetEntryQuery assetEntryQuery = new AssetEntryQuery();
assetEntryQuery.setClassName(JournalArticle.class.getName());
assetEntryQuery.setXXX //adding criterions
assetEntryQuery.setOrderByCol1("viewCount");
List<AssetEntry> assetEntries = AssetEntryServiceUtil.getEntries(assetEntryQuery);发布于 2012-07-19 20:38:36
对于DynamicQuery应用程序接口,恐怕没有直接的方法可以做到这一点。
我认为你需要使用带有服务构建器的Service builder Finders,也就是Custom Query。
发布于 2012-07-21 00:19:54
不能使用动态查询,因为没有从JournalArticle实体到AssetEntry实体的直接引用。
一种可能性是从AssetEntry表中检索文章的有序ids (基本上是dq0),然后执行另一个查询并通过编程进行排序(您已经对ids进行了排序)。
最后我觉得这句话
query.add(PropertyFactoryUtil.forName("articleParent.resourcePrimKey").in(dq0))并不是你想的那样。resoucePrimKey是对权限资源表的引用。您需要使用id列。
https://stackoverflow.com/questions/11559229
复制相似问题