1. 程式人生 > >Hibernate 多表查詢結果集的處理

Hibernate 多表查詢結果集的處理

Hibernate 是JDBC的輕量級封裝,一款傑出的ORM框架。通過它,可以建立資料表與表物件間的聯絡。

              Hibernate的查詢可通過HQL 和Criteira實現。本文僅展示用HQL實現多表查詢,並針對返回的結果集進行物件封裝。

              如果我們在Hibernate中需要查詢多個表的不同欄位,那麼如何來獲取Hibernate多表查詢的結果呢?有兩種方式:

1、 利用Hibernate重寫的List,從Obeject[ ]中取各個欄位分別轉化成對應型別,如下:

Java程式碼:

Query q = session.createQuery(" select members, classInfo.className " +       
    " from Members members, ClassInfo classInfo " +       
    " where members.level = classInfo.classCode ");          
List result = q.list();       
Iterator it = result.iterator();       
while (it.hasNext()) {       
   Object[] tuple = (Object[]) it.next();       
   Members members = (Members) tuple[ 0 ];       
   String className = (String) tuple[ 1 ];       
}     
這是獲取Hibernate多表查詢的結果的最常用的方式,利用Hibernate為了實現懶載入重寫所有Collection介面實現。

2

2、構造自己的複合型別,如下:

Java程式碼:

Query q = session.createQuery
(" select new ${path}.NewMembers(members, classInfo.className) " +       
    " from Members members, ClassInfo classInfo " +       
    " where members.level = classInfo.classCode ");     
Query q = session.createQuery
(" select new NewMembers(members, classInfo.className)
 " + " from Members members, ClassInfo classInfo " + " 
where members.level = classInfo.classCode ");  
當然我們需要有一個NewMembers類和相應的構造方式。

需要特別指出的是,定義的複核型別NewMembers務必要實現java.io.Serializable介面,定義相應的構造方法:一個預設不帶引數的,一個根據需要帶引數的(通常是全參,呵呵,因為本身成員變數就是量身定製);此外,在使用中,發現必須指定自定義型別的完整類名${path}.NewMembers,${path}為NewMembers的包名。

第二種方法顯然擴充套件性更好。

附上程式碼示例:

  1. select new com.cupd.jxxx.domain.mft.NewCmCode(a.id.bank,b.id.bankName,a.id.codeName,a.codeValue) from CmCode a,CmBank b where 
    1=1
  2. CmCode和CmBank 有對映檔案,這是必須的;  
  3. NewCmCode的定義  
  4. publicclass NewCmCode implements java.io.Serializable{  
  5. private String bank;  
  6. private String bankName;  
  7. private String codeName;  
  8. private String codeValue;  
  9. public NewCmCode(){  
  10. }  
  11. public NewCmCode(String bank, String bankName, String codeName,  
  12. String codeValue) {  
  13. super();  
  14. this.bank = bank;  
  15. this.bankName = bankName;  
  16. this.codeName = codeName;  
  17. this.codeValue = codeValue;  
  18. }  
  19. 及變數的geter/setter方法。