本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用
内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系。
本人互联网技术爱好者,互联网技术发烧友
微博:伊直都在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.OR 15 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 //添加至 criteria 22 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 from 11 GG_EMPLOYEE this_ 12 left outer join 13 GG_DEPARTMENT department2_ 14 on this_.DEPT_ID=department2_.ID 15 where 16 ( 17 this_.SALARY>=? 18 or this_.EMAIL is not null 19 ) 20 and ( 21 this_.NAME like ? 22 and this_.DEPT_ID=? 23 )
3)统计查询:Projections 封装了一些 sql的聚合函数
1 @Test 2 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 select 3 max(this_.SALARY) as y0_ 4 from 5 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 ( select 10 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 from 18 GG_EMPLOYEE this_ 19 left outer join 20 GG_DEPARTMENT department2_ 21 on this_.DEPT_ID=department2_.ID 22 order by 23 this_.SALARY asc, 24 this_.EMAIL desc ) row_ 25 where 26 rownum <= ? 27 ) 28 where 29 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 INTO 4 gg_department 5 6 VALUES 7 (?,?)
4.QBC 支持删除操作
1 @Test 2 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 from 4 GG_DEPARTMENT 5 where 6 ID=?
时间: 2024-12-19 04:05:29