【发布时间】:2020-11-16 18:27:35
【问题描述】:
如何使用 Criteria API 编写以下 JPQL 查询?
" select a from A a left join fetch a.bs b where b.i like 'X%' "
A-to-B 是一对多的关系,其中 A 和 B 如下所示:
@Entity
public class A {
@OneToMany(cascade={CascadeType.PERSIST})
private Set<B> bs = new HashSet<B>();
//...
}
@Entity
public class B {
private String i;
//...
}
我试过了:
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<A> cq = cb.createQuery( A.class );
Root<A> aRoot = cq.from( A.class );
Fetch<A, B> bs = aRoot.fetch(A_.bs, JoinType.LEFT);
cq.where(cb.like(what_do_i_do_here, "X%"));
cq.select(aRoot);
我需要获取所有这些As 及其关联的Bs,其中关联Bs 的i 值以"X" 开头。
编辑:
如果我尝试How to properly express JPQL "join fetch" with "where" clause as JPA 2 CriteriaQuery? 给出的方法,我不正确得到 2 As 结果而我应该只得到 1 A 其关联的 B_.i 具有以开头的值“X”。
我使用以下代码解决了这个问题:
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<A> cq = builder.createQuery( A.class );
Root<A> root = cq.from( A.class );
Join<A, B> bs = (Join<A, B>) root.fetch(Guide_.students, JoinType.LEFT);
cq.where(builder.like(bs.get(B_.i), builder.parameter(String.class, "i")));
cq.select(root);
TypedQuery<A> query = em.createQuery(criteria).setParameter("i", "X%");
List<A> as= query.getResultList();
for (A a: as) {
System.out.println(a);
}
【问题讨论】:
-
以下划线结尾的类就是所谓的元模型。它用于在进行连接(或获取)时访问实体的属性以及比较或使用它们。在 Eclipse 中,如果您二次单击项目/属性/JPA 并在“Canonical Metamodel 2.0”部分中选择要生成它们的目录,它们会自动生成。
-
@crizzis 谢谢 crizzis,它有帮助。我得到它与以下工作。不过应该有更好的方法来完成它。
CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaQuery<A> cq = cb.createQuery( A.class ); Root<A> aRoot = cq.from( A.class ); Join<A, B> bs = (Join<A, B>) aRoot.fetch(A_.bs, JoinType.LEFT); cq.where(cb.like(bs.get(B_.i), builder.parameter(String.class, "i"))); cq.select(aRoot); TypedQuery<A> query = em.createQuery(cq).setParameter("i", "X%"); -
@gaetanTEMATE 谢谢门。它有帮助,但我无法帮助我解决给定问题。
标签: jpa left-join jpql eager-loading criteria-api