【问题标题】:JPQL WHERE "containsAll"JPQL WHERE “包含所有”
【发布时间】: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


【解决方案1】:

不确定是否有更简单的替代方案,但这应该可行:

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)

【讨论】:

    猜你喜欢
    • 2016-11-30
    • 2022-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-17
    • 1970-01-01
    相关资源
    最近更新 更多