出现该问题的原因
Hibernate5.2之后,Criteria标准化查询差不多都转到使用Jpa包了,因此像session.createCriteria()等方法都提示了已过时。
在查看了Hibernate5.2文档之后,参考它上面的案例进行了测试和拓展,希望能帮到大家。
这里我使用Junit进行测试
测试前期准备
首先建立两个实体类
我这里分别建立了Emp.java和Dept.java实体类:
- Emp.java包含
emp_id(雇员id), ename(雇员姓名), job(雇员工作), tel(电话), hiredate(上岗时间), sal(薪水), dept(所属部门信息),以及get/set和构造函数。 - Dept.java包含
dept_id(部门id), dname(部门名),以及get/set和构造函数。
初始化Test.java
private SessionFactory sessionFactory;
private Session session;
private Transaction transaction;
/**
* 注意这个criteriaBuilder
*/
private CriteriaBuilder criteriaBuilder;
@Before
public void init() {
//一些基本属性的初始化
Configuration configuration = new Configuration().configure();
sessionFactory = configuration.buildSessionFactory();
session = sessionFactory.openSession();
transaction = session.beginTransaction();
//criteriaBuilder初始化
criteriaBuilder = session.getCriteriaBuilder();
}
测试单元
检索所有雇员信息
@Test
public void test01(){
//1. 获取CriteriaQuery对象
CriteriaQuery<Emp> createQuery = criteriaBuilder.createQuery(Emp.class);
//2. 指定根条件
createQuery.from(Emp.class);
//3. 通过session执行查询
List<Emp> list = session.createQuery(createQuery).list();
//4. 打印查询结果
for (Emp emp : list) {
System.out.println(emp.getEname());
}
}
查询部门号为1,且薪水大于100.00的所有雇员
@Test
public void test02(){
//1. 获取CriteriaQuery对象
CriteriaQuery<Emp> criteria = criteriaBuilder.createQuery(Emp.class);
//2. 指定根条件
Root<Emp> root = criteria.from(Emp.class);
//3. 创建两个查询条件
Predicate dept = criteriaBuilder.equal(root.get("dept"), new Dept(1, null, null));
Predicate sal = criteriaBuilder.gt(root.get("sal"), 1000.00);
//4. 将查询条件设置到where方法中
criteria.where(criteriaBuilder.and(dept, sal));
//5. 通过session执行查询
List<Emp> list = session.createQuery(criteria).list();
//6. 打印查询结果
for (Emp emp : list) {
System.out.println("name = \t" + emp.getEname() + "\tsal = \t" + emp.getSal() +
"\tdept_id = \t" + emp.getDept().getDept_id());
}
}
查询部门号为2,且薪水大于2000.00的所有雇员,或者job是CLERK的雇员
@Test
public void test03(){
CriteriaQuery<Emp> criteria = criteriaBuilder.createQuery(Emp.class);
Root<Emp> root = criteria.from(Emp.class);
//创建两个条件
Predicate dept = criteriaBuilder.equal(root.get("dept"), new Dept(2, null, null));
Predicate sal = criteriaBuilder.gt(root.get("sal"), 2000.00);
Predicate job = criteriaBuilder.equal(root.get("job"), "CLERK");
//到这里上面部分都与上一个案例类似
//注意在将多个条件且或嵌套时,可以使用or/and方法嵌套的方式进行
criteria.where(criteriaBuilder.or(criteriaBuilder.and(dept, sal), job));
List<Emp> list = session.createQuery(criteria).getResultList();
for (Emp emp : list) {
System.out.println("name = " + emp.getEname() + "\t\tsal = " + emp.getSal() +
"\t\tdept_id = " + emp.getDept().getDept_id() +
"\t\tjob = " + emp.getJob());
}
}
查询所有雇员,按薪水降序排序
@Test
public void test04() {
//1. 获取CriteriaQuery对象
CriteriaQuery<Emp> criteria = criteriaBuilder.createQuery(Emp.class);
//2. 指定根条件
Root<Emp> empRoot = criteria.from(Emp.class);
//3. 设置orderBy的字段,可同时对多个字段进行排序
criteria.orderBy(criteriaBuilder.desc(empRoot.get("sal")), criteriaBuilder.asc(empRoot.get("emp_id")));
//4. 执行查询并返回结果
List<Emp> list = session.createQuery(criteria).list();
//5. 打印查询结果
for (Emp emp : list) {
System.out.println(emp.getEmp_id() + " " + emp.getSal());
}
}
分页查询,按照工资降序排列,每页查询3个人, 查询第二页的雇员
@Test
public void test05() {
//1. 获取CriteriaQuery对象
CriteriaQuery<Emp> criteria = criteriaBuilder.createQuery(Emp.class);
//2. 指定根条件
Root<Emp> empRoot = criteria.from(Emp.class);
//3. 设置orderBy的字段
criteria.orderBy(criteriaBuilder.desc(empRoot.get("sal")));
//4. 设置分页的基本属性
int pageSize = 3;
int pageNow = 2;
int pageIndex = (pageNow - 1) * pageSize;
//5. 执行查询,这里需要指定查询的起始索引和查询的记录数量
List<Emp> list = session.createQuery(criteria).setFirstResult(pageIndex).setMaxResults(pageSize).list();
//6. 打印查询结果
for (Emp emp : list) {
System.out.println(emp.getEmp_id() + " " + emp.getSal());
}
}
后期提交事务并关闭会话
@After
public void destroy() {
//提交事务
transaction.commit();
//关闭session会话
session.close();
//关闭SessionFactory
sessionFactory.close();
}