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的包名。
第二種方法顯然擴充套件性更好。
附上程式碼示例:
-
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
- CmCode和CmBank 有對映檔案,這是必須的;
- NewCmCode的定義
- publicclass NewCmCode implements java.io.Serializable{
- private String bank;
- private String bankName;
- private String codeName;
- private String codeValue;
- public NewCmCode(){
- }
- public NewCmCode(String bank, String bankName, String codeName,
- String codeValue) {
- super();
- this.bank = bank;
- this.bankName = bankName;
- this.codeName = codeName;
- this.codeValue = codeValue;
- }
- 及變數的geter/setter方法。