一、JPA如何使用Spcification
dao层继承
public interface JpaSpecificationExecutor<T>
由此接口源码,看出有可以分页按条件查询和不分页按条件查询的功能public interface JpaSpecificationExecutor<T> {
T findOne(Specification<T> var1);
List<T> findAll(Specification<T> var1);
Page<T> findAll(Specification<T> var1, Pageable var2);
List<T> findAll(Specification<T> var1, Sort var2);
long count(Specification<T> var1);
}
二、实体类
有两格表,tb_student和tb_teacher表。多对一的关系。
tb_student表:student_id、name、teacher_id
tb_teacher表:teacher_id、name
Student实体类:
@Entity
@Table(name="tb_student")
public class Student {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name="user_id")
private Integer studentId; //学生Id为主键、自增
@Column
private String name;
@ManyToOne
@JoinColumn(name = "teacher_id")
private Teacher teacher;
//set、get方法
}
Teacher实体类:@Entity
@Table(name="tb_teacher")
public class Teacher {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name="user_id")
private Integer teacherId; //老师Id为主键、自增
@Column
private String name;
// set、get方法
}
三、重写toPredicate方法
查询的key是实体类的属性;
多表查询,通过join方法连接;
集合通过in和not方法筛选结果;
Specification<User> specification = new Specification<User>() {
@Override
public Predicate toPredicate(Root<User> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
List<Predicate> list = new ArrayList<>();
// 1.等于 选择name是“张三”的用户 Predicate equal(Expression<?> var1, Object var2);
list.add(cb.equal(root.get("name").as(String.class), "张三"));
// 2.多表查询 选择teacher是“老师甲”
list.add(cb.equal(root.join("teacher").get("name").as(String.class), "老师甲"));
// 3.不包括集合 studentId不是7、8、9
List notInList = Arrays.asList(7,8,9);
list.add(cb.not(root.get("studentId").in(notInList)));
// 4.包括集合 studentId是4、5、6
List inList = Arrays.asList(4,5,6);
list.add(root.get("studentId").in(inList));
Predicate[] p = new Predicate[list.size()];
// cb.and “and”表示这几个条件并且的关系 Predicate and(Predicate... var1);
return cb.and(list.toArray(p));
}
};
————————————————
版权声明:本文为CSDN博主「Luck_ZZ」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/Luck_ZZ/article/details/80138565