hibernate SQLQuery實踐指南

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

班級: Clazz (id, name)

學生: Student(id, name , class_id)



1. 查詢持久化對象
1.1 簡單查詢,返回數據庫結構
view plaincopy to clipboardprint?
sql = "select c.* from clazz c,student s where s.class_id = c.id";

List<Clazz> clazzs = (List<Clazz>)session.createSQLQuery(sql).list();

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

List<Clazz> clazzs = (List<Clazz>)session.createSQLQuery(sql).list();特別注意:返回結果是Object[]組成的List,通過Object下標訪問屬性

使用場合:非基於對象的查詢,複雜查詢

1.2 簡單查詢,返回持久化對象
sql = "select c.* from Clazz c , student s where s.class_id = c.id "; List<Clazz> clazzs = (List<Clazz>) session.createSQLQuery(sql).addEntity(Clazz.class).list();

特別注意: 1.addEntity方法指定返回包含Clazz對象的List 2. 查詢出來的持久態對象,clazz對象的studets屬性是各代理對象,訪問的時候纔會去查詢DB 使用場合:基於對象的查詢,但對象簡單查詢

1.3 多表查詢,返回多個實體
view plaincopy to clipboardprint?
String sql = "select {c.*}, {s.*} from Clazz c , student s where s.class_id = c.id ";

List<Clazz> clazzs = (List<Clazz>) session().createSQLQuery(sql)

.addEntity("c", Clazz.class)

.addEntity("s", Student.class).list();

String sql = "select {c.*}, {s.*} from Clazz c , student s where s.class_id = c.id ";

List<Clazz> clazzs = (List<Clazz>) session().createSQLQuery(sql)

.addEntity("c", Clazz.class)

.addEntity("s", Student.class).list();view plaincopy to clipboardprint?
特別注意:
1. addEntity方法指定了當前返回實體的別名,而且在SQL語句裏使用{c.*}這樣的語句,
它的意思是向別名爲c的這個對象注入所有屬性值.

2. 這個查詢會返回一個Object的List,每個Object包含兩個對象一個Clazz,一個

3. {}佔位符裏是對象的屬性,而非列名,如{s.class},而非{s.class_id}

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

使用場合:基於對象的查詢,複雜查詢

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

String sql = "select {c.*}, {s.*} from Clazz c , student s where s.class_id = c.id ";

List<Clazz> clazzs = (List<Clazz>) session().createSQLQuery(sql)

.addEntity("c", Clazz.class)

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

String sql = "select {c.*}, {s.*} from Clazz c , student s where s.class_id = c.id ";

List<Clazz> clazzs = (List<Clazz>) session().createSQLQuery(sql)

.addEntity("c", Clazz.class)

.addJoin("s", "c.students").list();view plaincopy to clipboardprint?
<P>特別注意: 這塊有些問題,明明應該返回Clazz的List的,但確返回包含Clazz和Student的Object的List, faint</P><P>使用場合:基於對象的查詢,複雜查詢</P>

特別注意: 這塊有些問題,明明應該返回Clazz的List的,但確返回包含Clazz和Student的Object的List, faint使用場合:基於對象的查詢,複雜查詢2. 查詢託管對象

view plaincopy to clipboardprint?
String sql = "select c.id, c.name from Clazz c , student s where s.class_id = c.id ";

List<Clazz> clazzs = (List<Clazz>) 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 ";

List<Clazz> clazzs = (List<Clazz>) session.createSQLQuery(sql)

.addScalar("id", Hibernate.LONG)

.addScalar("name", Hibernate.STRING)

.setResultTransformer(Transformers.aliasToBean(Clazz.class)).list();

特別注意:

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

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



本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/blackpark/archive/2008/07/05/2613754.aspx#
發佈了187 篇原創文章 · 獲贊 0 · 訪問量 9352
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章