2013-01-15 18 views
7

すべてタグを含むアイテムを見つけたいと思います。jpqlで指定されたセットのすべての要素を含むセットを持つアイテムを見つける

@Entity 
class Item { 
    @ManyToMany 
    var tags: java.util.Set[Tag] = new java.util.HashSet[Tag]() 
} 

@Entity 
class Tag { 
    @ManyToMany(mappedBy="tags") 
    var items: java.util.Set[Item] = new java.util.HashSet[Item] 
} 

私はこの

select distinct i 
from Item i join i.tags t 
where t in (:tags) 

のようにそれをしようとした場合、私は任意の与えられたタグを含むアイテムを取得する:ここで

は単純化されたクラスです。それは驚くべきことではありませんが、私はすべてのタグを含むを含むアイテムが必要です。だから私は他の方法の周りにそれを試してみてください。

select distinct i 
from Item i join i.tags t 
where (:tags) in t 

私は、エラーメッセージorg.hibernate.exception.SQLGrammarException: arguments of row IN must all be row expressionsを取得します。 tagsに1つのタグだけが含まれていても動作しますが、それ以上のエラーで失敗します。

JPQLでこれをどのように表現できますか?

select i from Item i join i.tags t 
where t in :tags group by i.id having count(i.id) = :tagCount 
+0

私はあなたがSQLクエリコードを書き直す必要がありますと思います。 –

+0

クエリークエリー= session.createQuery( "from stockId:stockId in:(in::code)"); query.setParameterList( "code"、idList); –

+0

あなたはあなたの質問で、どのように指定されたタグのいずれかを含むアイテムを得る方法を示してくれてありがとう!これは私が探していたものです。 '@ ElementCollection'でも動作することが確認できます。 –

答えて

8

トリックは、カウントを使用することです。私は、あなたが冬眠中の他の配列とセットを比較することはできないと思うので、あなたは反逆の広告の不条理を使用しました:

select distinct i from Item i where i not in (select i2 from Item i2 join i2.tags t where t not in :tags) 
+0

これは永遠にそれを見るのにかかるものの1つで、あなたがそうするとき、あなたはそれを一切見ないと信じることはできません –

2

は、私はちょうどあなたと同じ問題を抱えていた:

+0

私はすでに私が何を返したしかし、私はサブクエリの結果が小さくならないように、いくつかの条件を内部セレクトに追加する必要があります。代わりに、ここで説明した "group by"の後にstuffを追加する必要のないcountメソッドを使用しました(http://stackoverflow.com/a/21645545/429896)。 – HypeXR

関連する問題