2016-11-26 30 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

不知道如果有一個更簡單的替代方案,但這應該工作:

select a from A a where :sizeOfCSet = 
    (select count(distinct b.id) from B b where b.a = :a 
    and b.c.id in :cIds)