将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来做到这一点。

+0

你已经解决了吗?我有类似的问题。 – Mark 2012-08-20 14:01:25

您的要求是一个非常具体的情况,它需要SELECT声明中的聚合函数。

我建议在你的情况下使用Custom query(也称为custom-sql),而不是DynamicQuery

DynamicQuery API有它的局限性,并不会在你的情况下工作(从经验来讲,如果别人有关于以下点其他的意见或事实,我会更乐意知道):

  1. DynamicQuery无法连接。
  2. 它有可能返回一个count或使用Projection返回一个单独的列值,但不可能使用投影返回一列和计数到收集。
  3. 可以使用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