rDetailId", foreignKey = @ForeignKey(name = "none", value = ConstraintMode.NO_CONSTRAINT))
UserDetail userDetail;
@Column(nullable = false)
@Enumerated(value = EnumType.ORDINAL)
ActorType actorType = ActorType.A;
public enum ActorType{
A,B,C
}
}
public class UserDetail {
Long id;
@OneToOne(cascade = { CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH }, fetch = FetchType.LAZY)
@org.hibernate.annotations.ForeignKey(name = "none")
@JoinColumn(name = "actorId", foreignKey = @ForeignKey(name = "none", value = ConstraintMode.NO_CONSTRAINT))
Actor actor;
String truename;
}
public class Region {
Long id;
String name;
@OneToMany(cascade = { CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH }, fetch = FetchType.LAZY)
@JoinColumn(name = "regionId")
@org.hibernate.annotations.ForeignKey(name = "none")
List<Living> Livings;
}
现在要根据userdetai 种的 sex actor中的actortype 还有 region的id 为条件查询出满足条件的living。
public class PageParam<Living> {
private Integer pageSize = 10;
private Integer pageNumber = 1;
private Sex sex;
private ActorType actortype;
private Long cityid;
首先我还是封装了这样一个类,但是这里的泛型 我是直接给到了想要的查询结果的泛型,接下来 因为这里涉及到了一个 多表的查询 所以上面的单表查询的例子 已经不适合这个查询了,但是Criteria 的join方法 给我们提供了一个模式
Specification<Living> specification = new Specification<Living>() {
@Override
public Predicate toPredicate(Root<Living> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
List<Predicate> list = new ArrayList<Predicate>();
if (null!=sex) {
Join<UserDetail, Living> join = root.join("actor", JoinType.LEFT);
list.add(cb.equal(join.get("userDetail").get("sex"), sex ));
}
if (null!=actortype) {
Join<Actor, Living> join = root.join("actor", JoinType.LEFT);
list.add(cb.equal(join.get("actorType"), actortype));
}
if (null!=cityid) {
Join<Region, Living> join = root.join("region", JoinType.LEFT);
list.add(cb.equal(join.get("id"), cityid));
}
//Join<A, B> join = root.join("bs", JoinType.LEFT);
//list.add(cb.equal(join.get("c").get("id"), id));
Predicate[] p = new Predicate[list.size()];
return cb.and(list.toArray(p));
};
};
这里是我对条件进行的封装。jpa 的多条件