将SQL查询转换为具有连接或子查询的动态查询
问题描述:
我有一个SQL查询(2个变体),我需要在动态查询中使用它。将SQL查询转换为具有连接或子查询的动态查询
在SQL它看起来如此(变型1 //通过子查询):
SELECT AssetEntry.entryId , (
SELECT COUNT(*)
FROM `MBMessage`
WHERE classPK = AssetEntry.classPK
) AS comments
FROM `AssetEntry`
ORDER BY comments DESC
或用加入和组替代查询:
SELECT AssetEntry.entryId, count(MBMessage.classPK)
FROM `AssetEntry`
JOIN MBMessage ON (AssetEntry.classPK = MBMessage.classPK)
GROUP BY MBMessage.classPK
两个SQL查询显示一模一样!
现在我需要使用其中的一个作为动态查询。我不知道如何做一个连接,我不知道如何在投影中做一个子查询?!
任何人都可以帮助我吗? THX
我必须用custom-sql来做到这一点。
答
您的要求是一个非常具体的情况,它需要SELECT
声明中的聚合函数。
我建议在你的情况下使用Custom query(也称为custom-sql
),而不是DynamicQuery
。
DynamicQuery API有它的局限性,并不会在你的情况下工作(从经验来讲,如果别人有关于以下点其他的意见或事实,我会更乐意知道):
- DynamicQuery无法连接。
- 它有可能返回一个
count
或使用Projection
返回一个单独的列值,但不可能使用投影返回一列和计数到收集。 - 可以使用DynamicQuery的子查询使用投影,但我不认为您可以在
select
语句中使用DynamicQuery的子查询。
答
你有另一种方法来做到这一点,使用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);
+0
我不知道这是如何解决我的问题? – appsthatmatter 2012-08-07 13:33:03
你已经解决了吗?我有类似的问题。 – Mark 2012-08-20 14:01:25