[英]How to define multiple Join on condition using ctiteria API spring data JPA Specification?
下面是获取连接的代码
public static Specification<Item> findByCustomer(User user) {
return (root, criteriaQuery, criteriaBuilder) -> {
root.fetch(User_.address, JoinType.LEFT);
return criteriaBuilder.equal(root.get(User_.id), 1);
};
}
上面的代码生成下面的查询
选择 us.ALL_COLUMN, adr.ALL_COLUMN from User us left external join Address adr on us.id= adr.id where us.id = 1;
如何在左外连接上添加多个条件。 我想使用 spring 数据 jpa 规范生成以下查询。
选择 us.ALL_COLUMN, adr.ALL_COLUMN from User us left external join Address adr on us.id= adr.id and adr.effect_end_date = null where us.id = 1
public static Specification<A> findAbyBname(String input) {
return new Specification<A>() {
@Override
public Predicate toPredicate(Root<A> root, CriteriaQuery<?> cq, CriteriaBuilder cb) {
cq.distinct(true);
Join<A,AB> AjoinAB = root.joinList(A_.AB_LIST,JoinType.LEFT);
Join<AB,B> ABjoinB = AjoinAB.join(AB_.B,JoinType.LEFT);
return cb.equal(ABjoinB.get(B_.NAME),input);
}
};
}
我有这样的事情。 以下是实体:
@Entity
public class A {
@Id
private Long id;
private String name;
@OneToMany(mappedBy = "a")
private List<AB> abList;
}
@Entity
public class B {
@Id
private Long id;
private String name;
@OneToMany(mappedBy = "b")
private List<AB> abList;
}
@Entity
public class AB {
@Id
private Long id;
private String name;
@ManyToOne
@JoinColumn(name = "a_id")
private A a;
@ManyToOne
@JoinColumn(name = "b_id")
private B b;
}
在我们可以做的下面,我们应该有两个预测,然后对于这两个预测,没有测试
public static Specification<Item> findByCustomer(User user) {
return (root, criteriaQuery, criteriaBuilder) -> {
root.fetch(User_.address, JoinType.LEFT);
Predicate predicateForEndDate
= criteriaBuilder.equal(root.get(User_.end_date), null);
Predicate predicateForUser
= criteriaBuilder.equal(root.get(User_.id), 1);
return criteriaBuilder.and(predicateForEndDate, predicateForUser)
};
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.