重點是 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 的其他查詢條件以及一些日期的查詢技巧
session好像沒有關掉
回覆刪除