提问者:小点点

使用条件api通过集合字段的嵌套属性搜索


我试图找到所有具有一些嵌套元素和嵌套元素的实体具有元素集合,我需要通过这些集合的属性找到它。

应该是这样的东西

class A{
    private B b;
}

class B{
   private Collection<C> cCol;
}

class C{
   private String name;
}

所以我想获取所有具有B元素的A元素,这些元素具有名称与给定参数匹配的C。

不知道如何使用JPA CritieriaAPI。我知道JPQL中有谓词或MEMEBER OF,但我需要按集合中元素的属性搜索,而不是集合成员。

尝试了root. get(a.b.c.name)和root.fetch(a.b)或root.fetch(b.c)之类的东西,但最终总是出现一些关于非法api使用的例外


共3个答案

匿名用户

我想获取所有具有名称与给定参数匹配的C的B元素的A元素。

当尝试浏览条件时API我发现首先编写JPQL查询非常有帮助。这里是:

SELECT a
FROM A a
WHERE EXISTS(
    SELECT c FROM a.b b JOIN b.cCol c WHERE c.name = 'condition'
)

现在API标准变得更加清晰(如果有可能的话):

CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<A> aQuery = cb.createQuery(A.class);
Root<A> a = aQuery.from(A.class);

Subquery<C> cSubquery = aQuery.subquery(C.class);
Root<A> aSubroot = cSubquery.correlate(a);
Join<A, B> b = aSubroot.join("b");  // "b" is the name of the property of A that points to B
Join<B, C> c = b.join("cCol"); // "cCol" is the name of the property of C that holds the related C objects

cSubquery.select(c);
cSubquery.where(cb.equal(c.get("name"), "XXXXXXX"));

aQuery.where(cb.exists(cSubquery));

TypedQuery<A> aTypedQuery = em.createQuery(aQuery);
aTypedQuery.getResultList();

Java变量的名称与JPQL中的相同,例如Join

匿名用户

下面应该工作

root.get("a").get("b").get("name")

如何通过组合表使用JpaSpecficationExecator创建规范?

匿名用户

我成功是通过使用

root.**join**("a").get("b").get("name"):

因为这是一个收藏。