Java 使用Liferay'按另一个表订购;s动态查询

Java 使用Liferay'按另一个表订购;s动态查询,java,liferay,liferay-6,dynamicquery,Java,Liferay,Liferay 6,Dynamicquery,在Liferay 6中进行动态查询时遇到问题。我正试图根据视图计数对日志文章进行查询。视图计数在另一个表(asseentry)中指定 我被这件事困住了: DynamicQuery query = DynamicQueryFactoryUtil.forClass( JournalArticle.class, "articleParent", PortalClassLoaderUtil.getClassLoader()); //adding criterions query.add(...);

在Liferay 6中进行动态查询时遇到问题。我正试图根据
视图计数对
日志文章
进行查询。视图计数在另一个表(
asseentry
)中指定

我被这件事困住了:

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"));
这样,我会收到一条错误消息,说:
无法解析属性:asset of:com.liferay.portlet.journal.model.impl.JournalArticleImpl


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

恐怕没有直接的方法使用
DynamicQuery
API来实现这一点

我认为您需要使用,即与Service builder一起使用。

AssetEntryQuery AssetEntryQuery=new AssetEntryQuery();
AssetEntryQuery assetEntryQuery = new AssetEntryQuery();
assetEntryQuery.setClassName(JournalArticle.class.getName());
assetEntryQuery.setXXX //adding criterions
assetEntryQuery.setOrderByCol1("viewCount");
List<AssetEntry> assetEntries = AssetEntryServiceUtil.getEntries(assetEntryQuery);
assetEntryQuery.setClassName(JournalArticle.class.getName()); assetEntryQuery.setXXX//添加标准 setOrderByCol1(“视图计数”); 列出assetEntries=AssetEntryServiceUtil.getEntries(assetEntryQuery);
您不能使用动态查询,因为JournalArticle实体与AssetEntry实体之间没有直接引用

一种可能是从AssetEntry表中检索物品的有序ID(基本上是dq0),然后执行另一个查询并通过编程进行排序(您已对ID进行排序)

最后我觉得这一行

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

不会做你认为它会做的事。ResourcePrimKey是对资源表的权限引用。您需要使用id列。

我认为这并不能回答问题:您使用
//添加标准查询错过了第一个
查询
,则您的方式返回问题通过第二次查询
dq0
已经返回的
asseentry
。您计划如何返回
日志文章
s以及
日志文章
中指定的附加标准,而不是
AssetQuery
中指定的附加标准?可能有“n”个标准,如用户名、标题、URL标题、描述、内容、版本等,
AssetQuery
中可能没有这些标准。尽管大多数标准(如标题、说明、用户名)都已存在于
AssetQuery
中。