hibernate SqlQuery查詢字段對映

2021-08-29 07:31:42 字數 3112 閱讀 4160

如果使用原生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(newaliastobeanresulttransformer(catdto.class))

上面的查詢將會返回catdto的列表,它將被例項化並且將name和birthday的值注射入對應的屬性或者字段。

但必須注意,對每乙個列都必須addscalar("列名")

既然如此,

那麼setresulttransformer與addentity的區別是什麼呢?乙個區別是前者支援查任意的列,後者必須用select* from users的形式或select , 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中名稱一致(大小寫一致)

對於addscalar中的時間顯示問題:

在做兩表聯查時,使用hibernate的addscalar方法,.addscalar("create_time",timestamptype.instance)用timestamptype獲取的時間在頁面是正常顯示時分秒,顯示如下:2015-09-18 17:11:38;而使用datetype.instance獲取時間則不能正常顯示時分秒,顯示如下:2015-09-18 00:00:00

乙個栗子:

hibernate除了支援hql查詢外,還支援原生sql查詢。

對原生sql查詢執行的控制是通過sqlquery介面進行的,通過執行session.createsqlquery()獲取這個介面。該介面是query介面的子介面。

執行sql查詢步驟如下:

1、獲取hibernate session物件

2、編寫sql語句

3、通過session的createsqlquery方法建立查詢物件

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

5、如果sql語句包含引數,呼叫query的set***x方法為引數賦值

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 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 , 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")

sql查詢字段連線

我有乙個需求是把2個字段拼接成乙個字段,如 user user id,user code,user name 查詢結果是 user code user name 在寫sql語句時用連線符 select user code user name codename from user 上面這種寫法是ora...

oracle通過字段型別查詢字段

有的時候我們需要在oracle中通過欄位名 字段型別 字段長度 字段注釋 表名來查詢具體的字段資訊。比如 昨天同事問我,咱們資料庫裡面有用過blob型別的嗎?我一時也想不起來具體哪個欄位或那張表用了blob型別。於是就用如下語句查詢庫裡面所有字段型別為blob。具體sql如下 select b.co...

mysql統計查詢並查詢字段

select count 1 ifvote d.voteitemid from tp votedetail d where d.fgsid and d.voteid 943306615853940736 and d.personid 011217033621526565 order by d.vot...