我有以下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
答案 0 :(得分:0)
您可以发布对象映射吗?没有它们很难说,但感觉(从名称来看)你是在走向层次结构(从集合到所有者)而不是向下,这在使用Hibernate时有点不自然。
JOIN formData.deliveryResults as deliveryResults
是不必要的(它不会在任何地方使用)。大多数其他连接也可能是不必要的 - 对于“一对一”关联,您可以使用嵌套点表示法编写属性而无需显式连接。
您的GROUP BY
子句仅列出ID,而您选择的是完整实体(client和clientCampaign)。那不行 - 你必须explicitly list fields to group by。
根据您的映射,您可以使用父对子连接重写此查询;您可以在deliveryResults
集合中使用size()
功能而无需GROUP BY
。
答案 1 :(得分:0)
在发表其他评论之前,我最喜欢你提出HQL请求的方式,每个JOIN都在自己的行上。它非常易读。我建议你以相同的方式重构clientCampaign,即使你不使用别名......这也可能会改变一些结果(谁知道在原始请求的Hibernate内容中可以触发什么代码!?)。 / p>
你要求似乎在表格之间上下移动(从名称判断,如果它们以's'结尾)。这有点难以阅读。我可能会更容易为您和我们切换到单个订单(例如,从leadForm开始下降)。特别是,我们会检测到其他“连接”上升,并更仔细地检查它们(我在clientCampaignForms.clientCampaign
怀疑......)