首页 > 代码库 > [原创]java WEB学习笔记92:Hibernate学习之路-- -QBC 检索和本地 SQL 检索:基本的QBC 查询,带 AND 和 OR 的QBC,统计查询,排序,分页

[原创]java WEB学习笔记92:Hibernate学习之路-- -QBC 检索和本地 SQL 检索:基本的QBC 查询,带 AND 和 OR 的QBC,统计查询,排序,分页

本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用

内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系。

本人互联网技术爱好者,互联网技术发烧友

微博:伊直都在0221

QQ:951226918

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

1.QBC 检索和本地 SQL 检索

  1)QBC 查询就是通过使用 Hibernate 提供的 Query By Criteria API 来查询对象,这种 API 封装了 SQL 语句的动态拼装,对查询提供了更加面向对象的功能接口

  2)本地SQL查询来完善HQL不能涵盖所有的查询特性:添加操作

 

2.QBC 的具体实践和相关API

  1)基本的QBC 查询

 1 @Test 2     public void testQBC(){ 3         //1.创建一个Criteria 对象 4         Criteria criteria = session.createCriteria(Employee.class); 5          6         //2.添加查询条件: 在QBC 中查询条件使用 Criteria 表示 7         //Criteria 可以通过 Restrictions 的静态方法得到 8         criteria.add(Restrictions.eq("email", "SKUMAR")); 9         criteria.add(Restrictions.gt("salary", 5000F));10         11         //3.执行查询12         Employee employee = (Employee) criteria.uniqueResult();13         System.out.println(employee);14     }15     

 

 

  2)带 AND 和 OR 的QBC: Restrictions 封装了一个常用的逻辑运算,算术等

技术分享

  

 1 @Test 2     public void testQBC2(){ 3         Criteria criteria = session.createCriteria(Employee.class); 4          5         //1.AND :使用Conjunction 表示 6         //conjuntion 本身就是一个criteria 对象,且其中还可以添加Criteria 对象 7         Conjunction conjunction = Restrictions.conjunction(); 8         conjunction.add(Restrictions.like("name", "a",MatchMode.ANYWHERE)); 9         Department dept = new Department();10         dept.setId(80);11         conjunction.add(Restrictions.eq("dept", dept));12         System.out.println(conjunction); //(name like %a% and dept=Department [id=80])13         14         //2.OR15         Disjunction disjunction = Restrictions.disjunction();16         disjunction.add(Restrictions.ge("salary", 6000F));17         disjunction.add(Restrictions.isNotNull("email") );18         19         System.out.println(disjunction);//(salary>=6000.0 or email is not null)20         21         //添加至 criteria22         criteria.add(disjunction);23         criteria.add(conjunction);24         25         //执行26         criteria.list();27         28     }

 

 1 Hibernate:  2     select 3         this_.ID as ID1_1_1_, 4         this_.NAME as NAME2_1_1_, 5         this_.SALARY as SALARY3_1_1_, 6         this_.EMAIL as EMAIL4_1_1_, 7         this_.DEPT_ID as DEPT_ID5_1_1_, 8         department2_.ID as ID1_0_0_, 9         department2_.NAME as NAME2_0_0_ 10     from11         GG_EMPLOYEE this_ 12     left outer join13         GG_DEPARTMENT department2_ 14             on this_.DEPT_ID=department2_.ID 15     where16         (17             this_.SALARY>=? 18             or this_.EMAIL is not null19         ) 20         and (21             this_.NAME like ? 22             and this_.DEPT_ID=?23         )

 

 

  3)统计查询:Projections 封装了一些 sql的聚合函数

技术分享

  

1 @Test2     public void testQBC3(){3         Criteria criteria = session.createCriteria(Employee.class);4         5         //统计查询:使用Projection 来表示 可以由Projections 静态方法得到6         criteria.setProjection(Projections.max("salary"));7         System.out.println(criteria.uniqueResult());8         9     }

 

1 Hibernate: 2     select3         max(this_.SALARY) as y0_ 4     from5         GG_EMPLOYEE this_6 24000.0

 

 

  4)排序,分页

 1     @Test 2     public void testQBC4(){ 3         Criteria criteria = session.createCriteria(Employee.class); 4         //1.添加排序 5         criteria.addOrder(Order.asc("salary")); 6         criteria.addOrder(Order.desc("email")); 7          8         //2.添翻页方法 9         int pageSize = 5;10         int pageNo = 3;11         criteria.setFirstResult((pageNo -1 ) * pageSize)12                 .setMaxResults(pageSize)13                 .list();14 15         16     }17     

 

 1 Hibernate:  2     select 3         *  4     from 5         ( select 6             row_.*, 7             rownum rownum_  8         from 9             ( select10                 this_.ID as ID1_1_1_,11                 this_.NAME as NAME2_1_1_,12                 this_.SALARY as SALARY3_1_1_,13                 this_.EMAIL as EMAIL4_1_1_,14                 this_.DEPT_ID as DEPT_ID5_1_1_,15                 department2_.ID as ID1_0_0_,16                 department2_.NAME as NAME2_0_0_ 17             from18                 GG_EMPLOYEE this_ 19             left outer join20                 GG_DEPARTMENT department2_ 21                     on this_.DEPT_ID=department2_.ID 22             order by23                 this_.SALARY asc,24                 this_.EMAIL desc ) row_ 25         where26             rownum <= ?27         ) 28     where29         rownum_ > ?

 

 

 

3.由于QBC 不支持插入操作,所以hibernate 支持使用原生的 sql 进行更新操作

 1 @Test 2     public void testNaviteSQL(){ 3         String sql = "INSERT INTO gg_department VALUES(?,?)"; 4         Query query = session.createSQLQuery(sql); 5          6         query.setInteger(0, 300) 7             .setString(1, "JASON") 8             .executeUpdate(); 9         10     }
1 Hibernate: 2     INSERT 3     INTO4         gg_department5         6     VALUES7         (?,?)

 

 

 4.QBC 支持删除操作

1 @Test2     public void testUpdate(){3         String hql = "DELETE FROM Department d WHERE d.id = :id";4         session.createQuery(hql).setInteger("id", 280).executeUpdate();5     }

 

1 Hibernate: 2     delete 3     from4         GG_DEPARTMENT 5     where6         ID=?

 

[原创]java WEB学习笔记92:Hibernate学习之路-- -QBC 检索和本地 SQL 检索:基本的QBC 查询,带 AND 和 OR 的QBC,统计查询,排序,分页