1. 程式人生 > >Hibernate(十五):QBC檢索和本地SQL檢索

Hibernate(十五):QBC檢索和本地SQL檢索

page eight _id div dpa like where sel ati

  • 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_.NAME 
as 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檢索