2012-10-08 5 views
5

厄介なハイバネートクエリの問題については助けが必要です。 book_id列とTAG_IDと結合テーブルbooks_tags_mnで表され、両者の間の多対多関連がありHibernate:コレクションに指定されたすべてのvalusが含まれているエンティティを選択してください

public class Book { 
    private String bookId; 
    private String author; 
    private String isbn; 
    private Set<Tag> tags; 
    // getters, setters etc. 
} 

public class Tag { 
    private String tagId; 
    private String tagName; 
    // getters, setters, etc. 
} 

:私は、次のエンティティを持っています。

私が好きなのは次のとおりです。特定のタグセットのすべてを持つすべての本を返すハイバネートクエリ/条件クエリを作成したいとします。どのような働きをするのは、のタグをすべて含むの書籍を選択することです。

私は基準APIを使いこなしてきましたが、それを本当に理解していませんでした。したがって、この上、私は(擬似HQLで)やろうとしています

from Book book where book.tags containsAll(:tags) 

するすべてのヘルプは高く評価されるだろう、そう事前にどうもありがとうございました。

from Book book where containsAll(collect(book.tags), :tags) 

:関数が定義されて登録されると、あなたのようHQL /基準クエリを実行することができるだろう

collect(book.tags) -> returns list of tags associated with the book 

containsAll(bookTagsList, tags) --> validates and returns true if all 
            tags elements are present in bookTagsList 
            returned by the first function "collect" 

答えて

3

次のクエリを使用できます。

select book from Book book 
where :numberOfTags = (select count(tag.id) from Book book2 
         inner join book2.tags tag 
         where book2.id = book.id 
         and tag in (:tags)) 

numberOfTagsが一致しなければならないタグ​​のセット内のタグの数です。

+0

感謝を追加する必要があるとして! –

+0

コレクションに(IDにではなく)重複を含めることができる場合は、count(distinct) – Ben

0

私がように2つのカスタム関数や制約を作成することをアドバイスうまたは

session.createCriteria(Book.class).add(
      Restrictions.add(collect("tags").containsAll(tags)) 
     ).list(); 

注:これはアイデアを共有するための単なる擬似コードです。

希望すると便利です。

0

JB Nizetから受け入れられた回答は良いですが、あなたのコレクションに重複が含まれている場合はうまくいきません(正当な理由かもしれませんが、タグの例ではないかもしれません)。

一部の書籍のコレクションに「MyTag」という名前の重複タグを含めることができます。タグ "MyTag"、 "YourTag"を検索すると、2つの "MyTag"タグを持ち、 "YourTag"タグを持たない書籍を返すことができます。

select b from Book b where :numberOfTags = (select count(distinct tag.tagName) from Book b2 inner join b2.tags tag where b2.id = b.id and tag.tagName IN (:tagNames)) 

私は受け入れ答えと間違って何も言わなかったが、あなたはその後、コレクション内の重複をサポートする必要がある場合、あなたは魔法のように動作回数(個別のtag.name)

関連する問題