hibernate SQLQuery實踐指南

2021-08-22 18:39:53 字數 3955 閱讀 7379

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

班級: clazz (id, name)

學生: student(id, name , class_id)

1.1 簡單查詢,返回資料庫結構

view plain

copy to clipboard

print?

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

??list?clazzs?=?(list)session.createsqlquery(sql).list();??

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

listclazzs = (list)session.createsqlquery(sql).list();

特別注意:返回結果是object組成的list,通過object下標訪問屬性

使用場合:非基於物件的查詢,複雜查詢

1.2 簡單查詢,返回持久化物件

??sql = "select c.* from clazz c , student s where s.class_id = c.id?"; ???listclazzs = (list) session.createsqlquery(sql).addentity(clazz.class).list();

特別注意: 1.addentity方法指定返回包含clazz物件的list 2. 查詢出來的持久態物件,clazz物件的studets屬性是各**物件,訪問的時候才會去查詢db 使用場合:基於物件的查詢,但物件簡單查詢

1.3 多表查詢,返回多個實體

view plain

copy to clipboard

print?

string?sql?=?"select?,??from?clazz?c?,?student?s?where?s.class_id?=?c.id???";??

??list?clazzs?=?(list)?session().createsqlquery(sql)??

???????????????????????????????????.addentity("c",?clazz.class)??

???????????????????????????????????.addentity("s",?student.class).list();??

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

listclazzs = (list) session().createsqlquery(sql)

.addentity("c", clazz.class)

.addentity("s", student.class).list();

view plain

copy to clipboard

print?

特別注意:???

1.?addentity方法指定了當前返回實體的別名,而且在sql語句裡使用這樣的語句,??

它的意思是向別名為c的這個物件注入所有屬性值.??

特別注意:

1. addentity方法指定了當前返回實體的別名,而且在sql語句裡使用這樣的語句,

它的意思是向別名為c的這個物件注入所有屬性值.

view plain

copy to clipboard

print?

2.?這個查詢會返回乙個object的list,每個object包含兩個物件乙個clazz,乙個student??

view plain

copy to clipboard

print?

3.?{}佔位符裡是物件的屬性,而非列名,如,而非??

view plain

copy to clipboard

print?

4.?必須注入物件的每個屬性值,你可以使用,或者手工寫全所有,但必須是所有屬性。(這個太讓我鬱悶了。???

view plain

copy to clipboard

print?

使用場合:基於物件的查詢,複雜查詢??

1.4 ?多表查詢,返回關聯實體

view plain

copy to clipboard

print?

string?sql?=?"select?,??from?clazz?c?,?student?s?where?s.class_id?=?c.id???";??

??list?clazzs?=?(list)?session().createsqlquery(sql)??

??????????.addentity("c",?clazz.class)??

??????????.addjoin("s",?"c.students").list();??

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

listclazzs = (list) session().createsqlquery(sql)

.addentity("c", clazz.class)

.addjoin("s", "c.students").list();

view plain

copy to clipboard

print?

特別注意:?這塊有些問題,明明應該返回clazz的list的,但確返回包含clazz和student的object的list,?faint

使用場合:基於物件的查詢,複雜查詢??

2. 查詢託管物件

view plain

copy to clipboard

print?

string?sql?=?"select?c.id,?c.name?from?clazz?c?,?student?s?where?s.class_id?=?c.id???";?????

??list?clazzs?=?(list)?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   ";

listclazzs = (list) session.createsqlquery(sql)

.addscalar("id", hibernate.long)

.addscalar("name", hibernate.string)

.setresulttransformer(transformers.aliastobean(clazz.class)).list();

特別注意:

1. 如果不設定addscalar方法可能會報轉型錯誤的異常.

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

禮物 2008-09-04 17:35

hibernate SQLQuery實踐指南

hibernate sqlquery實踐指南 兩個表 實體 1對多雙向關聯 班級 clazz id,name 學生 student id,name class id 1.查詢持久化物件 1.1 簡單查詢,返回資料庫結構 sql select c.from clazz c,student s wher...

hibernate SqlQuery查詢字段對映

如果使用原生sql語句進行query查詢時,hibernate是不會自動把結果包裝成實體的。所以要手動呼叫addentity classclass 等一系列方法。如session.createsqlquery sql addentity classclass 注意hibernate3.0.5不支援,...

Linux系統命令及Shell指令碼實踐指南筆記

系統執行級別 執行級0 關機 執行級1 單使用者模式,系統出現問題時可使用這種模式進入系統維護,典型的使用場景 就是在忘記root密碼時可進入次模式修改root密碼。執行級2 多使用者模式,但是沒有網路連線。執行級3 完全多使用者模式,這也是linux伺服器最常見的執行級。執行級4 保留未使用。執行...