1. 程式人生 > >hibernate SqlQuery查詢欄位對映

hibernate SqlQuery查詢欄位對映

如果使用原生sql語句進行query查詢時,hibernate是不會自動把結果包裝成實體的。所以要手動呼叫addEntity(Classclass)等一系列方法。

如session.createSQLQuery(sql).addEntity(Classclass);注意hibernate3.0.5不支援,單個引數的addEntity方法

另外,hibernate3.2可以對原生sql查詢使用ResultTransformer。這會返回不受Hibernate管理的實體。 session.createSQLQuery("SELECT NAME, BIRTHDATE FROM CATS")              .setResultTransformer(Transformers.aliasToBean(CatDTO.class))

或setResultTransformer(new AliasToBeanResultTransformer(CatDTO.class)) 上面的查詢將會返回CatDTO的列表,它將被例項化並且將NAME和BIRTHDAY的值注射入對應的屬性或者欄位。

但必須注意,對每一個列都必須addScalar("列名") 既然如此,

那麼setResultTransformer與addEntity的區別是什麼呢?一個區別是前者支援查任意的列,後者必須用select* from users的形式或select {a.*},{b.*} from a,b where ....。

hibernate持久化對映實體類(Class)用.addEntity ,必須返回所有的欄位(*)

不受Hibernate管理的實體類(Dto)用.addScalar.setResultTransformer(),可以選取select任意欄位。但是condition中的.addScalar()必須要用new StringType來指定返回欄位型別。

addEntity和addScalar可以混用。

.setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP); //返回一個map,KEY:為DB中名稱一致(大小寫一致)

一個栗子:

 Hibernate除了支援HQL查詢外,還支援原生SQL查詢。

         對原生SQL查詢執行的控制是通過SQLQuery介面進行的,通過執行Session.createSQLQuery()獲取這個介面。該介面是Query介面的子介面。

         執行SQL查詢步驟如下:

         1、獲取Hibernate Session物件

         2、編寫SQL語句

         3、通過Session的createSQLQuery方法建立查詢物件

         4、呼叫SQLQuery物件的addScalar()或addEntity()方法將選出的結果與標量值或實體進行關聯,分別用於進行標量查詢或實體查詢

         5、如果SQL語句包含引數,呼叫Query的setXxxx方法為引數賦值

         6、呼叫Query的list方法返回查詢的結果集

在多表查詢的時候使用hibernate的sql查詢的時候,一般返回的是object[]陣列,或者可以使用

 session.createSQLQuery(sql).setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);

來轉化為map來進行處理,可以通過以下方式將查詢結果轉化為實體類:

1,sql語句 String sql="select s.id as id,s.classname as classname from grade s,student st where s.id=st.classid"

利用以下語句

session.createSQLQuery(sql)      .setResultTransformer(Transformers.aliasToBean(Grade.class))可以將sql中查詢出來的欄位轉化為班級這個實體類,但是必須為每個欄位指定別名,別名就是班級類裡面的對應的屬性,但必須注意,對每一個列都必須addScalar("列名"),如果不設定addScalar方法可能會報轉型錯誤的異常.如果查詢的結果裡面包括多個表裡面的欄位,不能對應一個實體類去接受,就需要新建一個與查詢結果對應的實體類,或者直接使用map結果集

2,sql語句 String sql="select {s.*} from grade s,student st where s.id=st.classid" 

針對這樣的全部欄位查詢的sql可以利用addEntity來轉化為實體類

SQLQuery query=session.createSQLQuery(sql) ;

query.addEntity("s", Grade.class);

SQL查詢語句,它帶一個佔位符,可以讓Hibernate使用欄位的別名.

查詢返回的實體,和它的SQL表的別名.

addEntity()方法將SQL表的別名和實體類聯絡起來,並且確定查詢結果集的形態。

這樣就可以將班級這張表裡面的所有欄位的值賦值給班級這個實體類,而且必須是所有的屬性

3,sql語句 String sql="select {s.*},{st.*} from grade s,student st where s.id=st.classid" 

SQLQuery query=session.createSQLQuery(sql) ;

query.addEntity("s", Grade.class);

query.addEntity("st", Student.class);

利用這樣的查詢得到的是一個object[]陣列,object[0]就是班級實體類,object[1]就是學生實體類

可以用addScalar(String arg,Type type)方法定義要返回的欄位型別,如

s.createSQLQuery(shuiQingHQL).addScalar("STCD",Hibernate.STRING).addScalar("STNM")