1

我有以下 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 实例为空。但是,如果我从 SELECT 子句中删除 count( formData ) 行,则 clientCampaign 实例不再为空。我检查了数据集,总共有 5 条 formData 记录……一个 clientCampaign 有 3 条,另一个有 2 条。所以,我相信这个查询应该返回 2 个结果,两个结果都是非空的 clientCampaign 实例。

谁能告诉我这里是否有明显的遗漏?

TIA

4

2 回答 2

0

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

您的请求似乎在上下表之间移动(从名称来看,它们是否以“s”结尾)。有点难读。对于您和我们来说,切换到单个订单可能会更容易(例如,从leadForm开始)。特别是,我们会检测到其他“连接”上升,并更仔细地检查它们(我怀疑clientCampaignForms.clientCampaign......)

于 2009-08-30T13:52:29.390 回答
0
  1. 你能发布你的对象映射吗?没有它们很难说,但感觉(从名称判断)你是在向上(从集合到所有者)而不是向下走,这在使用 Hibernate 时有点不自然。

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

  3. 您的GROUP BY子句仅列出了 ID,而您正在选择完整的实体(客户端和 clientCampaign)。那是行不通的——你必须明确列出要分组的字段

根据您的映射,您可以使用父子连接重写此查询;您可以size()deliveryResults不需要GROUP BY.

于 2009-08-28T18:43:32.180 回答