【发布时间】:2017-04-10 17:36:00
【问题描述】:
我在查询时遇到了一些问题,我想获得只有那些 B 具有给定 ID 的 C 的类 A。但是如果 A 也有另一个 B.C 它也在加载。如果存在,如何使用给定的 id 强制加载?
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());
【问题讨论】:
-
因为它是无效的 JPQL,正如任何 JPQL 参考或 JPA 规范所说的那样。清楚地发布错误消息将使该帖子有意义......
-
您似乎在 Dmitry 下方收到了答案,对您有帮助吗?
-
是的,但我不检查它,因为它现在实际上不需要。我会接受作为答案。谢谢
-
好的。即使您不再需要帮助,请始终在此处回复志愿者。
标签: hibernate jpa spring-data jpql