1

次の HQL を使用しています。

SELECT lo.id, lo.priority, COUNT(p.id) 
FROM LoadingOrder AS lo LEFT OUTER JOIN lo.palettes AS p
WHERE SUBSTRING(p.space.id, 1, 1) = 'B'

問題は、パレットなしで注文を読み込んでいることが表示されないことです。WHERE 句がない場合、パレットのないロード オーダーが表示されます (最後の列は 0 です)。

私はすでに次のようなものを追加しようとしました:

SELECT lo.id, lo.priority, COUNT(p.id) 
FROM LoadingOrder AS lo LEFT OUTER JOIN lo.palettes AS p
WHERE ((p.id IS NULL) OR (SUBSTRING(p.space.id, 1, 1) = 'B'))

しかし、それは役に立ちません(pまたはp.space.idがnullかどうかを確認するときも)。部分文字列で条件を設定し、パレットがない場合に結果を含める方法は?

4

1 に答える 1

3

単純な SQL では、次のクエリがあるとします select * from A left outer join B on A.x=B.x。結果には、A ごとに少なくとも 1 つの行があり、B がない場合は、それらの行に null 列があります。を追加するとしwhere B.y=1ます。DB は最初に外部結合を行い、次に where 句を適用します。Null 値は何にも等しくないため、それらの行はすべて破棄されます。最終的には、B を持つ A のみが含まれ、期待したものとはまったく異なります。

SQL での解決策は、これを「on」句に追加することselect * from A left outer join B on A.x=B.x and B.y=1です。この場合、DB は外部結合中にこれを適用するため、レコードは破棄されません。

Hibernate では、それほど明白ではありません (または十分に文書化されています) が、例の" where " を " with " に置き換えるだけで、HQL を SQL に変換するときに、それを "on" 句に配置する必要があります。 .

于 2013-10-04T04:31:16.800 に答える