【发布时间】:2019-02-14 11:32:44
【问题描述】:
我遇到了一个问题,我无法找出如何使用 criteriaQuery 在两个表上生成 左外连接。 我有两个表 A_1 和 A_2
@Entity()
@Table(name = "A_1")
public class A1 {
private long id_1;
private long name;
private long city;
}
@Entity()
@Table(name = "A_2")
public class A2 {
private long id_2;
private long a_1_id_1;
private long name;
}
我必须找出所有存在于 A_1 表中但不在 A_2 表中的条目。 A_1 表中的 id_1 与 a_1_id_1 相同。
为此,我尝试如下查询:
select * from A_1 LEFT OUTER JOIN A_2 ON A_1.id_1 = A_2.a_1_id_1 where A_2.a_1_id_1 is NULL
我从我的查询中得到了想要的结果。 但我不知道如何将其更改为代码,基本上是这个左外连接部分。我已经尝试了很多来自网络的选项,但无法找到解决方案。
我的代码是这样的:
CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery<Tuple> query = cb.createTupleQuery();
Root<A_1> root1 = query.from_1(A_1.class);
Root<A_2> root2 = query.from(A_2.class);
List<Predicate> predicates = getPredicates(cb, root1, root1, request);
我无法决定如何使用它来获得我想要的结果。 提前致谢。
【问题讨论】:
-
你的意思是,喜欢使用
join方法?而不是发明一个新的根对象 -
@BillyFrost :无法理解您的观点。我想使用普通的左外连接
-
您通过使用 JPA Criteria 中的
join方法来使用“普通左外连接”!你还没有,你只是做了两次from,每一次都为查询创建一个根(又名交叉连接)。互联网上有大量的文档...datanucleus.org:15080/products/accessplatform_5_2/jpa/…您使用关系加入,但您似乎没有掌握模型中的面向对象点 -
感谢@BillyFrost:浏览了文档,很有帮助。需要更多帮助,是否可以在谓词中添加空值。 select o.o_id from orders_table as o left outer join pttt_table as p on o.o_id = p.o_id where p.o_id is null;这是我的查询,我想做与此相同的操作,但我无法理解如何指定此空条件
标签: java hibernate jpa criteriaquery