我们使用JpaSpecificationExecutor的方法Page<T> findAll(Specification<T> spec, Pageable pageable);做分页查询,有时候查询T实体类会关联其他实体类,并且根据该实体类某个字段作为条件传入查询值,那么该如何设置这个关联对象呢?解决方法如下:
public Specification<License> getSpecification() {
Specification<License> specification = new Specification<License>() {
@Override
public Predicate toPredicate(Root<License> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
List<Predicate> list = new ArrayList<>();
Join<License, HomeRoom> join = root.join("homeRoom", JoinType.LEFT);
Predicate roomSidPre = cb.equal(join.get("ownerPhone"), "13600539847");
list.add(roomSidPre);
return cb.and(list.toArray(new Predicate[list.size()]));
}
};
return specification;
}
代码中的License类对象与HomeRoom类对象是一对一关系,License类中的homeRoom属性定义如下:
@OneToOne
@JoinColumn(name ="room_sid", insertable = false, updatable = false)
private HomeRoom homeRoom;
这样子就可以通过上面的代码设置HomeRoom类中ownerPhone字段为查询条件了。