1

2 つのオブジェクト インスタンスと、3 番目のオブジェクト インスタンスに基づく集計カウントを返そうとする次の HQL クエリがあります。

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 レコードがありました... 1 つの clientCampaign に 3 つ、別のクライアントに 2 つです。したがって、このクエリは 2 つの結果を返し、どちらも null 以外の clientCampaign インスタンスを返す必要があると思います。

ここで私が見逃している明らかな何かがあるかどうか誰にもわかりますか?

ティア

4

2 に答える 2

0
  1. オブジェクト マッピングを投稿できますか? それらなしで言うのは難しいですが、(名前から判断すると) 階層を (コレクションから所有者まで) 下降するのではなく、上昇しているように感じます。これは、Hibernate を使用すると多少不自然です。

  2. JOIN formData.deliveryResults as deliveryResults不要です(どこでも使用されていません)。他のほとんどの結合も不要な場合があります。「対 1」の関連付けの場合、明示的な結合なしで、ネストされたドット表記を使用してプロパティを記述できます。

  3. 完全なエンティティ(clientおよびclientCampaign GROUP BY)を選択しているのに対し、句にはIDのみがリストされています。それはうまくいきません -グループ化するフィールドを明示的にリストする必要があります。

マッピングによっては、親子結合を使用してこのクエリを書き直すことができる場合があります。を必要とせずに、コレクションでsize()関数を使用できる場合があります。deliveryResultsGROUP BY

于 2009-08-28T18:43:32.180 に答える
0

他のコメントの前に、最初に HQL リクエストを提示する方法が気に入っています。各 JOIN はそれぞれの行にあります。とても読みやすいです。エイリアスを使用しない場合でも、clientCampaign を同じ方法でリファクタリングすることをお勧めします...これにより、一部の結果が変わる可能性もあります (元のリクエストで Hibernate の内部でどのコードがトリガーされるかは誰にもわかりません!?)。

要求が上下するテーブル間を移動するように見えます (名前から判断すると、's' で終わるかどうか)。少し読みにくいです。おそらく、あなたにとっても私たちにとっても、単一の注文に切り替える方が簡単でしょう(たとえば、リードフォームから始めて、下に行くなど)。特に、上昇する他の「結合」を検出し、それらをより注意深く調べます (私は疑わしいclientCampaignForms.clientCampaignです ...)。

于 2009-08-30T13:52:29.390 に答える