2016-11-26 9 views
0

私はクエリにいくつかの問題があります。私は与えられたidを持つCを持つBだけを持つクラスAを取得したいと思います。しかし、Aにも別のB.Cがある場合は、それもロードしています。存在する場合は、指定されたIDで負荷を強制する方法。JPQL WHERE "containsAll"

私はこのようにしてみてください、それは動作しません
class A { 
    @OneToMany(mappedBy = "a", orphanRemoval = true) 
    private List<B> bList; 
    ... 
} 

class B { 

@ManyToOne 
@JoinColumn(name = "aid", nullable = false) 
private A a; 

@ManyToOne(cascade = CascadeType.PERSIST) 
@JoinColumn(name = "cid", nullable = false) 
private C c; 
... 
} 

@Query(value = "SELECT a from A a inner join a.b b where b.c.id in :#{#param.cIdSet} GROUP BY a HAVING COUNT(DISTINCT b) = :size") 
List<A> findByCustom(@Param("param") AParam aSearchParam); 

今、私はこのように行うが、それはありません必要なエンティティの量をロード:

... 
     List<B> bList = bRepository.findByCustomQuery(aSearchParam); 

    Set<A> aSet = bList.stream() 
      .map(B::getA) 
      .collect(Collectors.toSet()); 
      ...... 
    return aSet.stream() 
      .filter(it -> bList.containsAll(it.bList())) 
      .collect(Collectors.toList()); 
+0

JPQLリファレンスまたはJPA仕様と同様に、無効なJPQLです。明らかにエラーメッセージを投稿すると、そのポストは意味のあるものになります。 –

+0

ドミトリー以下の回答を受けたようですが、それは助けとなりましたか? – halfer

+1

はい、私はそれをチェックしません。なぜなら、実際には今必要ではないからです。私は答えとして受け入れます。 Thx –

答えて

0

わかりませんもっと簡単な方法があれば、これはうまくいくはずです: