2012-05-04 7 views
71

私はこのクエリのバリエーションを試し続けており、これは起こりそうにないようです。私もこの投稿を参照しました:Path Expected for Join! Nhibernate Errorと私のクエリに同じロジックを適用するように見えることはできません。私のUserオブジェクトにはUserGroupコレクションがあります。HQLエラー:結合に予想されるパス

私は、ユーザーへの関連付けを保持するエンティティに名前を付ける必要がある

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

答えて

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

。詳細については、Hibernate documentation on HQL and joinsを参照してください。

+22

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

+2

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

+1

このHQL構文は面倒です。私は多くの例を見つけなければならず、あなたを見つけました。 –

38

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

エラーメッセージが文句を言っている「パス」だ
... INNER JOIN ug.user u ... 

- UserエンティティへのUserGroupからのパス。

Hibernateは、結合条件がマッピングメタデータで宣言されている宣言的なJOINに依存しています。このため、パスを持たないネイティブSQLクエリを構築することは不可能です。一方のエンティティから他方へHQL文で

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

使用パス、:名前付きクエリとして

+9

最後に、問題の根本に回答している人(既存のエイリアスに接頭辞を付ける必要があります) は、私の問題を解決しました。 –

関連する問題