Hibernate(十五):QBC檢索和本地SQL檢索
- QBC檢索
QBC查詢就是通過使用Hibernate提供的Query By Criteria API來查詢對象,這種API封裝了SQL語句的動態拼裝,對查詢提供了更加面向對象的功能接口。
1)通過Critera實現具有條件的查詢
1 @Test 2 public void testCriteria00() { 3 // 1、創建criteria對象 4 Criteria criteria = session.createCriteria(Employee.class); 5 6 // 2、添加過濾條件可以用Criterion表,Criterion可以通過Restrictions的靜態方法返回。7 criteria.add(Restrictions.eq("email", "[email protected]")); 8 criteria.add(Restrictions.gt("salary", 1000F)); 9 10 System.out.println(criteria.uniqueResult()); 11 }
執行sql及結果:
Hibernate: select this_.ID as ID1_1_0_, this_.NAMEas NAME2_1_0_, this_.SALARY as SALARY3_1_0_, this_.EMAIL as EMAIL4_1_0_, this_.DEPARTMENT_ID as DEPARTME5_1_0_ from DX_EMPLOYEE this_ where this_.EMAIL=? and this_.SALARY>? Employee [id=11, name=tommy10, salary=10000.0, [email protected]
2)通過Critera實現具有AND OR條件的查詢
1 @Test 2 public void testCriteraAndOr() { 3 Criteria criteria = session.createCriteria(Employee.class); 4 5 // AND :使用Conjunction表示,Conjunction本身就是一個Criterion對象,且其中還可以添加Criterion對象 6 Conjunction conjunction = Restrictions.conjunction(); 7 conjunction.add(Restrictions.like("name", "2", MatchMode.ANYWHERE)); 8 Department depart = new Department(); 9 depart.setId(5); 10 conjunction.add(Restrictions.eq("department", depart)); 11 12 // OR 13 Disjunction disjunction = Restrictions.disjunction(); 14 disjunction.add(Restrictions.gt("salary", 10000F)); 15 disjunction.add(Restrictions.isNull("email")); 16 17 criteria.add(disjunction); 18 criteria.add(conjunction); 19 20 List<Employee> items = (List<Employee>) criteria.list(); 21 System.out.println(items.size()); 22 }
執行sql及結果:
1 Hibernate: 2 select 3 this_.ID as ID1_1_0_, 4 this_.NAME as NAME2_1_0_, 5 this_.SALARY as SALARY3_1_0_, 6 this_.EMAIL as EMAIL4_1_0_, 7 this_.DEPARTMENT_ID as DEPARTME5_1_0_ 8 from 9 DX_EMPLOYEE this_ 10 where 11 ( 12 this_.SALARY>? 13 or this_.EMAIL is null 14 ) 15 and ( 16 this_.NAME like ? 17 and this_.DEPARTMENT_ID=? 18 ) 19 2
3)通過Critera實現統計查詢:使用Projection 來表示
1 @Test 2 public void testStatistics(){ 3 Criteria criteria=session.createCriteria(Employee.class); 4 5 // 統計查詢:使用Projection 來表示 6 criteria.setProjection(Projections.max("salary")); 7 8 System.out.println(criteria.uniqueResult()); 9 }
執行sql及結果:
1 Hibernate: 2 select 3 max(this_.SALARY) as y0_ 4 from 5 DX_EMPLOYEE this_ 6 79000.0
4)通過Critera實現排序、分頁查詢
1 @Test 2 public void testOrderByAndPager() { 3 Criteria criteria = session.createCriteria(Employee.class); 4 5 // 1) Order By 6 criteria.addOrder(Order.desc("salary")); 7 criteria.addOrder(Order.desc("name")); 8 9 // 2) Pager 10 int pageSize = 5; 11 int pageNum = 2; 12 List<Employee> employees = (List<Employee>) criteria.setFirstResult((pageNum - 1) * pageSize).setMaxResults(pageSize).list(); 13 14 System.out.println(employees.size()); 15 }
執行sql及結果:
1 Hibernate: 2 select 3 this_.ID as ID1_1_0_, 4 this_.NAME as NAME2_1_0_, 5 this_.SALARY as SALARY3_1_0_, 6 this_.EMAIL as EMAIL4_1_0_, 7 this_.DEPARTMENT_ID as DEPARTME5_1_0_ 8 from 9 DX_EMPLOYEE this_ 10 order by 11 this_.SALARY desc, 12 this_.NAME desc limit ?, 13 ? 14 5
更多關於QBC的使用方式需要參考Hibernate官網實例。
- 本地SQL查詢
本地SQL查詢來完善HQL不能涵蓋所有的查詢特性。
Hibernate(十五):QBC檢索和本地SQL檢索