我有一个SQL查询(2个变种),我需要将它用于动态查询。
在SQL中看起来如此(变体1 //通过子查询):
SELECT AssetEntry.entryId , (
SELECT COUNT(*)
FROM `MBMessage`
WHERE classPK = AssetEntry.classPK
) AS comments
FROM `AssetEntry`
ORDER BY comments DESC
或者使用join和group的替代查询:
SELECT AssetEntry.entryId, count(MBMessage.classPK)
FROM `AssetEntry`
JOIN MBMessage ON (AssetEntry.classPK = MBMessage.classPK)
GROUP BY MBMessage.classPK
两个SQL查询显示完全相同!
现在我需要使用其中一个作为动态查询。我不知道如何进行连接,我不知道如何在投影中做一个子查询?!
任何人都可以帮助我吗? THX
我必须使用custom-sql执行此操作。
答案 0 :(得分:0)
您的要求是一个非常具体的案例,需要SELECT
语句中的聚合函数。
我建议在您的案例中使用Custom query(在liferay中也称为custom-sql
),而不是DynamicQuery
。
DynamicQuery API有局限性,在您的情况下不起作用(根据经验说话,所以如果其他人有关于以下几点的其他意见或事实,我会非常乐意知道):< / p>
count
返回Projection
或返回单个列值,但无法返回列并计算使用投影进行收集。select
语句中使用DynamicQuery进行子查询。答案 1 :(得分:0)
使用AssetEntryQuery,您还有另一种方法。
AssetEntryQuery aeq = new AssetEntryQuery();
aeq.setClassName(MBMessage.class.getName());
aeq.set.... (Add any other criterions if you want to)
List<AssetEntry> assetEntries = AssetEntryServiceUtil.getEntries(aeq);