Hibernate5.2之后QBC查询——createCriteria()等方法过时的解决方法

出现该问题的原因

Hibernate5.2之后,Criteria标准化查询差不多都转到使用Jpa包了,因此像session.createCriteria()等方法都提示了已过时。
在查看了Hibernate5.2文档之后,参考它上面的案例进行了测试和拓展,希望能帮到大家。
这里我使用Junit进行测试

测试前期准备

首先建立两个实体类

我这里分别建立了Emp.java和Dept.java实体类:

  1. Emp.java包含
    emp_id(雇员id), ename(雇员姓名), job(雇员工作), tel(电话), hiredate(上岗时间), sal(薪水), dept(所属部门信息),以及get/set和构造函数。
  2. 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();
    }
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值