使用连接或子查询将SQL查询转换为动态查询

时间:2012-08-02 08:38:27

标签: hibernate liferay dynamicquery dynamic-queries

我有一个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执行此操作。

2 个答案:

答案 0 :(得分:0)

您的要求是一个非常具体的案例,需要SELECT语句中的聚合函数。

我建议在您的案例中使用Custom query(在liferay中也称为custom-sql),而不是DynamicQuery

DynamicQuery API有局限性,在您的情况下不起作用(根据经验说话,所以如果其他人有关于以下几点的其他意见或事实,我会非常乐意知道):< / p>

  1. 使用DynamicQuery无法加入。
  2. 可以使用count返回Projection或返回单个列值,但无法返回列并计算使用投影进行收集。
  3. 可以使用投影使用DynamicQuery进行子查询,但我认为您不能在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);