HQL中的Count函数导致null结果?

时间:2009-08-28 18:13:11

标签: hibernate count hql aggregate-functions

我有以下HQL查询尝试返回2个对象实例以及基于第3个对象实例的聚合计数。

SELECT
    client,
    clientCampaign,
    count( formData )
FROM
    FormData as formData
    JOIN formData.deliveryResults as deliveryResults
    JOIN formData.leadForm as leadForm
    JOIN leadForm.campaignForms as campaignForms
    JOIN campaignForms.clientCampaignForms.clientCampaign as clientCampaign
    JOIN clientCampaign.client as client
WHERE
    client.id = ?
GROUP BY
    client.id, clientCampaign.id

结果始终返回,clientCampaign实例为null。但是,如果我从SELECT子句中删除count(formData)行,则clientCampaign实例不再为null。我检查了数据集,总共有5个formData记录... 3个用于一个clientCampaign,2个用于另一个。所以,我相信这个查询应该返回2个结果,两个都是非null的clientCampaign实例。

有人能告诉我这里有什么明显的东西吗?

TIA

2 个答案:

答案 0 :(得分:0)

  1. 您可以发布对象映射吗?没有它们很难说,但感觉(从名称来看)你是在走向层次结构(从集合到所有者)而不是向下,这在使用Hibernate时有点不自然。

  2. JOIN formData.deliveryResults as deliveryResults是不必要的(它不会在任何地方使用)。大多数其他连接也可能是不必要的 - 对于“一对一”关联,您可以使用嵌套点表示法编写属性而无需显式连接。

  3. 您的GROUP BY子句仅列出ID,而您选择的是完整实体(client和clientCampaign)。那不行 - 你必须explicitly list fields to group by

  4. 根据您的映射,您可以使用父对子连接重写此查询;您可以在deliveryResults集合中使用size()功能而无需GROUP BY

答案 1 :(得分:0)

在发表其他评论之前,我最喜欢你提出HQL请求的方式,每个JOIN都在自己的行上。它非常易读。我建议你以相同的方式重构clientCampaign,即使你不使用别名......这也可能会改变一些结果(谁知道在原始请求的Hibernate内容中可以触发什么代码!?)。 / p>

你要求似乎在表格之间上下移动(从名称判断,如果它们以's'结尾)。这有点难以阅读。我可能会更容易为您和我们切换到单个订单(例如,从leadForm开始下降)。特别是,我们会检测到其他“连接”上升,并更仔细地检查它们(我在clientCampaignForms.clientCampaign怀疑......)