hibernate SQLQuery實踐指南

準備:
兩個表(實體), 1對多雙向關聯: sql

班級: Clazz (id, name)數據庫

學生: Student(id, name , class_id)session

1. 查詢持久化對象  
1.1 簡單查詢,返回數據庫結構
view plaincopy to clipboardprint?
sql = "select c.* from clazz c,student s where s.class_id = c.id";     
 
List<Clazz> clazzs = (List<Clazz>)session.createSQLQuery(sql).list();  代理

 sql = "select c.* from clazz c,student s where s.class_id = c.id";   orm

 List<Clazz> clazzs = (List<Clazz>)session.createSQLQuery(sql).list();特別注意:返回結果是Object[]組成的List,經過Object下標訪問屬性對象

使用場合:非基於對象的查詢,複雜查詢ip

1.2 簡單查詢,返回持久化對象
  sql = "select c.* from Clazz c , student s where s.class_id = c.id ";    List<Clazz> clazzs = (List<Clazz>) session.createSQLQuery(sql).addEntity(Clazz.class).list();it

特別注意: 1.addEntity方法指定返回包含Clazz對象的List 2. 查詢出來的持久態對象,clazz對象的studets屬性是各代理對象,訪問的時候纔會去查詢DB 使用場合:基於對象的查詢,但對象簡單查詢io

1.3 多表查詢,返回多個實體
view plaincopy to clipboardprint?
String sql = "select {c.*}, {s.*} from Clazz c , student s where s.class_id = c.id   ";  
 
List<Clazz> clazzs = (List<Clazz>) session().createSQLQuery(sql)  
 
                                 .addEntity("c", Clazz.class)  
 
                                 .addEntity("s", Student.class).list();  form

String sql = "select {c.*}, {s.*} from Clazz c , student s where s.class_id = c.id   ";

List<Clazz> clazzs = (List<Clazz>) session().createSQLQuery(sql)

                                 .addEntity("c", Clazz.class)

                                 .addEntity("s", Student.class).list();view plaincopy to clipboardprint?
特別注意:   
1. addEntity方法指定了當前返回實體的別名,並且在SQL語句裏使用{c.*}這樣的語句,  
它的意思是向別名爲c的這個對象注入全部屬性值. 

特別注意:
1. addEntity方法指定了當前返回實體的別名,並且在SQL語句裏使用{c.*}這樣的語句,
它的意思是向別名爲c的這個對象注入全部屬性值.view plaincopy to clipboardprint?
2. 這個查詢會返回一個Object的List,每一個Object包含兩個對象一個Clazz,一個Student 

2. 這個查詢會返回一個Object的List,每一個Object包含兩個對象一個Clazz,一個Studentview plaincopy to clipboardprint?
3. {}佔位符裏是對象的屬性,而非列名,如{s.class},而非{s.class_id} 

3. {}佔位符裏是對象的屬性,而非列名,如{s.class},而非{s.class_id}view plaincopy to clipboardprint?
4. 必須注入對象的每一個屬性值,你可使用{c.*},或者手工寫全全部,但必須是全部屬性。(這個太讓我鬱悶了。  

4. 必須注入對象的每一個屬性值,你可使用{c.*},或者手工寫全全部,但必須是全部屬性。(這個太讓我鬱悶了。 view plaincopy to clipboardprint?
使用場合:基於對象的查詢,複雜查詢 

使用場合:基於對象的查詢,複雜查詢1.4  多表查詢,返回關聯實體

view plaincopy to clipboardprint?
String sql = "select {c.*}, {s.*} from Clazz c , student s where s.class_id = c.id   ";  
 
List<Clazz> clazzs = (List<Clazz>) session().createSQLQuery(sql)  
 
        .addEntity("c", Clazz.class)  
 
        .addJoin("s", "c.students").list(); 

String sql = "select {c.*}, {s.*} from Clazz c , student s where s.class_id = c.id   ";

List<Clazz> clazzs = (List<Clazz>) session().createSQLQuery(sql)

  .addEntity("c", Clazz.class)

  .addJoin("s", "c.students").list();view plaincopy to clipboardprint?
<P>特別注意: 這塊有些問題,明明應該返回Clazz的List的,但確返回包含Clazz和Student的Object的List, faint</P><P>使用場合:基於對象的查詢,複雜查詢</P> 

特別注意: 這塊有些問題,明明應該返回Clazz的List的,但確返回包含Clazz和Student的Object的List, faint使用場合:基於對象的查詢,複雜查詢2. 查詢託管對象

view plaincopy to clipboardprint?
String sql = "select c.id, c.name from Clazz c , student s where s.class_id = c.id   ";     
 
List<Clazz> clazzs = (List<Clazz>) session.createSQLQuery(sql)        
 
                                     .addScalar("id", Hibernate.LONG)  
 
                                     .addScalar("name", Hibernate.STRING)       
 
                                     .setResultTransformer(Transformers.aliasToBean(Clazz.class)).list(); 

String sql = "select c.id, c.name from Clazz c , student s where s.class_id = c.id   ";  

List<Clazz> clazzs = (List<Clazz>) session.createSQLQuery(sql)     

                                     .addScalar("id", Hibernate.LONG)

                                     .addScalar("name", Hibernate.STRING)    

                                     .setResultTransformer(Transformers.aliasToBean(Clazz.class)).list();

特別注意:

1. 若是不設置addScalar方法可能會報轉型錯誤的異常.

2.託管查詢可使用投影,只查詢指定的列屬性

相關文章
相關標籤/搜索