1. 程式人生 > >hibernate和HQL語句

hibernate和HQL語句

注意:HQL語言,是基於物件進行查詢的,不是基於資料庫的表。

1、基本的HQL查詢

1.1 使用HQL查詢的一般步驟

[java]  view plain  copy
  1. public void test01() {  
  2.     Session session = HibernateUtils.openSession();  
  3.     Query query = session.createQuery("from Student");  
  4.     List<Student> stus = query.list();  
  5.      for (Student stu : stus) {  
  6.         System.out.println(stu);  
  7.     }  
  8. }  

1.2  在HQL中,不能使用 select * from Student ,但是可以使用別名 select stu from Student stu

[java]  view plain  copy
  1. public void test02() {  
  2.     Session session = HibernateUtils.openSession();  
  3.     Query query = session.createQuery("select stu from Student stu");  
  4.     List<Student> stus = query.list();  
  5.     for (Student stu : stus) {  
  6.         System.out.println(stu);  
  7.     }  
  8. }  

1.3  鏈式查詢的用法

[java]  view plain  copy
  1. public void test03() {  
  2.     Session session = HibernateUtils.openSession();  
  3.     List<Student> stus = session.createQuery(" from Student ")  
  4.             .list();  
  5.     for (Student stu : stus) {  
  6.         System.out.println(stu);  
  7.     }  
  8. }  

1.4  基於?的查詢 (JDBC的下標從1開始,Hibernate的下標從0開始)

[java]  view plain  copy
  1. public void test04() {  
  2.     Session session = HibernateUtils.openSession();  
  3.     Student stu = (Student) session  
  4.             .createQuery(" from Student where id = ? ").setParameter(01)  
  5.             .uniqueResult();  
  6.       
  7.     System.out.println(stu);  
  8.   
  9. }  


1.5 基於別名的查詢 id = :id (使用Map進行,別名的封裝)

[java]  view plain  copy
  1. public void test05() {  
  2.     Session session = HibernateUtils.openSession();  
  3.     // 利用一個Map對,用到的別名進行封裝  
  4.     Map<String, Object> map = new HashMap<String, Object>();  
  5.     map.put("id"1);  
  6.     map.put("age"18);  
  7.     // 查詢  
  8.     Student stu = (Student) session  
  9.             .createQuery(" from Student where id = :id  and age = :age")//  
  10.             .setParameter("id", map.get("id"))//  
  11.             .setParameter("age", map.get("age"))//  
  12.             .uniqueResult();  
  13.     // 輸出查詢結果  
  14.     System.out.println(stu);  
  15.   
  16. }  

2、常用的HQL查詢

2.1  查詢一個表裡面的記錄數(當查詢結果唯一時,可以使用 uniqueResult( ) )

[html]  view plain  copy
  1. public void test06() {  
  2.     Session session = HibernateUtils.openSession();  
  3.     Long countRecord = (Long) session.createQuery(  
  4.             "select count(*) from Student").uniqueResult();  
  5.     int count = countRecord.intValue();  
  6.     System.out.println(count);  
  7. }  

2.2  查詢一個表中的某幾個欄位,返回的是一個 Object [ ] 的陣列(投影查詢) 按照年齡的分組查詢

[java]  view plain  copy
  1. public void test07() {  
  2.     Session session = HibernateUtils.openSession();  
  3.     // 按照年齡的分組查詢  
  4.     List<Object[]> stus = session.createQuery(  
  5.             "select stu.age , count(*) from Student stu group by stu.age")  
  6.             .list();  
  7.     // 輸出查詢結果  
  8.     for (Object[] obj : stus) {  
  9.         System.out.println("年齡:" + obj[0] + " 的人數為:" + obj[1]);  
  10.     }  
  11. }  

2.3  DTO 資料傳輸物件的使用,

2.3.1  要將查詢出來的列,利用 as 關鍵字進行重新的命名

[sql]  view plain  copy
  1. select stu.age as age , count(*) as count from Student stu group by stu.age  

2.3.2  使用,setResultTransformer(Transformers.aliasToBean(AgeGroup.class)),進行結果的轉化


2.3.3 DTO資料傳輸物件 ,AgeGroup.java的程式碼

[java]  view plain  copy
  1. public class AgeGroup {  
  2.     private int age;  
  3.     private Long count;  
  4.   
  5.     public AgeGroup() {  
  6.     }  
  7.   
  8.     // get set  
  9.   
  10.     @Override  
  11.     public String toString() {  
  12.         return "AgeGroup [age=" + age + ", count=" + count + "]";  
  13.     }  
  14.   
  15. }  

2.3.4  使用DTO,查詢的程式碼如下

[java]  view plain  copy
  1. public void test08() {  
  2.     Session session = HibernateUtils.openSession();  
  3.     // 按照年齡的分組查詢  
  4.     List<AgeGroup> stus = session  
  5.             .createQuery(//  
  6.                   &