2011年7月7日 星期四

Hibernate 教學 - HQL 基本介紹

HQL 為 Hibernate 的查詢語句,他很類似於 SQL 但是比所能達到的功能有些許限制

重點是 HQL 為一種物件導向式的查詢語言,簡單說 HQL 是可以直接針對實體物件進行查詢、修改...等

而不像 SQL 是針對 Table,以下用一個最簡單的 select...from 來介紹 HQL

一般的 SQL 的 select * from t_product --- 指 撈出 t_product 這個 table 的所有欄位資料

如果是 HQL 會這樣寫 select p from Product p --- 這裡的 Product 為一個實體物件

以上這樣的寫法 可以簡化成 from Product as p 或是 from Product p

甚至還可以這樣寫 from Product

只要記得的是 from 後面接的是一個 Java 的實體類別,如果只是要撈出 t_product 的 name 欄位呢?

HQL : select p.name from Product --- 注意這裡的 p.name

p 目前唯一個 Product 的物件,p.name 表示了 p 物件的 name 屬性


也就是說在定義 Product 這個類別時一定會有著一個叫 name 的屬性

而且還可以利用建構子的方式達成同樣的效果

HQL : select new Product(p.name) from Product p

以下繼續運用 Hibernate 的 API 執行一個完整的查詢語句
List<Product> list = null;
try{
    session = HibernateUtils.getSession(); //取得 Session
    tx = session.beginTransaction();  //開始交易
    
    Query query = session.createQuery("from Product"); //運用session建立 Query 對象
    list = query.list(); //執行查詢,傳回結果List
    
    tx.commit() //提交事務
}catch(Exception e){....}

記得,在 SQL 中基本的語法 select、delete、count()、update 等 HQL 都有支援

再繼續以上的條件,如果要一次撈出 t_product 的 name 和 count 兩個欄位資料時

就要注意一下了 因為在查詢多個屬性時,Hibernate 會以 Object[] 的型態回傳

也就是說如果下了以下的 HQL 時

List<Object[]> list = null;
try{
    session = HibernateUtils.getSession(); //取得 Session
    tx = session.beginTransaction();  //開始交易
    
    //運用session建立 Query 對象
    Query query = session.createQuery("select p.name, p.count from Product p"); 
    list = query.list(); //執行查詢,傳回結果List
    
    tx.commit() //提交事務

    for(Iterator iterator = list.iterator();iterator.hasNext();){
        Object[] object = (Object[])iterator.next();  //取出一個 Object[] 物件
        for(int i=0;i<object.length;i++){
            if(i == 0){ // name 屬性
                System.out.println("name = " + object[i]);
            }
            if(i == 1){ //count 屬性
                System.out.println("count = " + object[i]);
            }
        } 
    }
    /*因為在下 HQL 時是先取出 name 屬性在取出 count 屬性
      所以將兩筆屬性放入陣列時 會依照此順序*/
}catch(Exception e){....}

如果你不想接受 Object[] 的這種回傳格式的話,還可以運用 List 或是 Map 集合

總結以上 select new Product(p.name) from Product p 的建構子寫法即可達成目標

select new List(p.name, p.count) from Product p

之後我在介紹 HQL 的其他查詢條件以及一些日期的查詢技巧

1 則留言: