2017-08-25 13 views
1

はじめ

が含まれています私は春データ/ JPA/Hibernateのなどを使用し、(javax.persistence.Entityで注釈を付け)エンティティいorg.springframework.stereotype.CrudRepositoryを拡張リポジトリ経由で取得されています。CrudRepositoryのfindAll()はサブリスト

私はエンティティを持っていますが、それはBobと呼ばれ、別のタイプのエンティティのリスト、Tomが含まれています。このリストはList<Tom> toms;と呼ばれます。これは私のデータベースの多対多の関係です。

@Repository 
public interface BobRepository extends CrudRepository<Bob, String> { 
    public Iterable<Bob> findAllByTomsContains(List<Tom> toms); 
} 

これは、春には限り私はそれを正しく名前として私のための世話を自動的に実施方法の一つです。

私の質問

私はトムズの提供されたリストは、各ボブに保存されているタムのサブセットであるすべてのボブを取得する必要があります。つまり、メソッドに提供するリストは、Bobエンティティに格納されているリストのサブセットです。

今、上記のコードで、私はトムズリストの各項目についてボブの結果を取得しています。だから私のボブの一人がこれらのToms {"tom-one"、 "tom-two"、 "tom-blue"}と{"tom-one"、 "tom_two"}を検索したら、同じトム。同様に、ボブのリストと一致しない追加のトムを追加すると、最初に一致するトムが実行され、返されます。このようなクエリは、BobsとリストされたすべてのToms以上と一致する必要があります。

私の方法に適した命名規則(現時点ではfindAllByTomsContains)は何ですか?私の現在の回避策は、リスト内の各Tomによる多くのクエリであり、結果の交差点をマージします(遅い、苦しい)。

+0

状態の非常に紛らわしい説明は))あなたはplsは、それを単純化してもらえますか?または、具体的な例を提供していますか?.. – Cepr0

+0

@ Cepr0それをもっと簡略化する方法がわかりません...エンティティには別のエンティティタイプのリストが含まれています。私が提供するリストがエンティティに格納されているリストのサブセット/リストである場合にのみ、私のデータベースから最初のエンティティタイプをすべて取得する必要があります。この質問に答えるには、Springに慣れている必要があります。 –

答えて

1
@Query("select b from Bob b join b.toms t where t in (?1) group by b having count(t) >= (select count(t2) from Tom t2 where t2 in (?1))") 
Iterable<Bob> findIfSubsetOfTomsExists(List<Tom> toms); 

または:

@Query("select b from Bob b join b.toms t where t in (?1) group by b having count(t) >= ?2") 
Iterable<Bob> findIfSubsetOfTomsExists(List<Tom> toms, int tomsCount); 

default Iterable<Bob> getIfSubsetOfTomsExists(List<Tom> toms) { 
    return findIfSubsetOfTomsExists(toms, toms.size()); 
} 
+0

これは正しく聞こえるが、動作していない。リストトームに1つのアイテムしか含まれていない場合にのみ機能します。私は秒を追加するとすぐに、一致するかどうかにかかわらず、0個のエンティティが返されます。 –

+0

@BitFractureは更新をチェックします... – Cepr0

+0

これは一意でないバージョンの結果は、リスト内のタグの組み合わせに一致するものです。したがって、クエリに4つのアイテムがある場合、一致するアイテムのうち1つ、2つ、3つまたは4つは、一致するエンティティの応答を生成します。 'distinct'は重複を避けますが、クエリ内のすべてのアイテムよりも少ない数のマッチで問題が修正されるわけではありません。返されるエンティティは、クエリ内のすべてのアイテムに一致する必要がありますが、追加アイテムが含まれている可能性があります。 {"hi"、 "cat"、 "moose"}を{"hi"、 "cat"}のBobに照会すると失敗するはずです。それ以外の方法で成功するでしょう。 –

関連する問題