HQLエラー:結合にパスが必要です


100

私はこのクエリのバリエーションを試し続け、これを実現できないようです。私もこの投稿を参照しました:パスは結合に期待されています!Nhibernate Errorと同じロジックをクエリに適用できないようです。私のUserオブジェクトが持っているUserGroupコレクションを。

クエリはオブジェクト内のエンティティを参照する必要があることを理解していますが、私が見ているものから...

@NamedQuery(
  name = "User.findByGroupId",
  query =
    "SELECT u FROM UserGroup ug " +
    "INNER JOIN User u WHERE ug.group_id = :groupId ORDER BY u.lastname"
)

回答:


131
select u from UserGroup ug inner join ug.user u 
where ug.group_id = :groupId 
order by u.lastname

名前付きクエリとして:

@NamedQuery(
  name = "User.findByGroupId",
  query =
    "SELECT u FROM UserGroup ug " +
    "INNER JOIN ug.user u WHERE ug.group_id = :groupId ORDER BY u.lastname"
)

HQLステートメントで、あるエンティティから別のエンティティへのパスを使用します。詳細については、HQLと結合に関するHibernateのドキュメントを参照してください。


32
「パス」とは何ですか?HQLドキュメントを検索しましたが、定義が見つかりませんでした。
gwg

7
これは、エンティティをリンクする必要があることを意味します。上記の彼の例では、彼がug.user uをどのように配置するかに注意してください。その前にugがないと、エラーが発生します。また、「ug.user u」の「user」は、クラスUserGroupのフィールドの名前である必要があります。
Lawrence

6
このHQL構文は厄介です。私はたくさんの例を見つけなければならず、あなたの例を見つけました。
BANG力丸

次に、エンティティで宣言された明示的なマッピング(結合に使用されるフィールド)がないと、エンティティを「手動で」結合できませんか?
アンダーソン氏

67

ユーザーへの関連付けを保持するエンティティに名前を付ける必要があります。例えば、

... INNER JOIN ug.user u ...

それは、エラーメッセージが不平を言っている「パス」です-UserGroupからUserエンティティへのパス。

Hibernateは宣言的なJOINに依存しており、その結合条件はマッピングメタデータで宣言されています。これが、パスがないとネイティブSQLクエリを構築することができない理由です。


13
最後に、問題の根本に答える誰かが...(外部テーブルに既存のエイリアスをプレフィックスする必要がある)私の問題を解決しました。
Saad Benbouzid

6
どのような場合:エンティティで関連付けを行わず、「Long userId」などを保存しただけの場合。
Spektakulatius
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.