準備:
兩個表(實體), 1對多雙向關聯: sql
班級: Clazz (id, name)數據庫
學生: Student(id, name , class_id)session
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"; orm
List<Clazz> clazzs = (List<Clazz>)session.createSQLQuery(sql).list();特別注意:返回結果是Object[]組成的List,經過Object下標訪問屬性對象
使用場合:非基於對象的查詢,複雜查詢ip
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();it
特別注意: 1.addEntity方法指定返回包含Clazz對象的List 2. 查詢出來的持久態對象,clazz對象的studets屬性是各代理對象,訪問的時候纔會去查詢DB 使用場合:基於對象的查詢,但對象簡單查詢io
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(); form
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的這個對象注入全部屬性值.
特別注意:
1. addEntity方法指定了當前返回實體的別名,並且在SQL語句裏使用{c.*}這樣的語句,
它的意思是向別名爲c的這個對象注入全部屬性值.view plaincopy to clipboardprint?
2. 這個查詢會返回一個Object的List,每一個Object包含兩個對象一個Clazz,一個Student
2. 這個查詢會返回一個Object的List,每一個Object包含兩個對象一個Clazz,一個Studentview plaincopy to clipboardprint?
3. {}佔位符裏是對象的屬性,而非列名,如{s.class},而非{s.class_id}
3. {}佔位符裏是對象的屬性,而非列名,如{s.class},而非{s.class_id}view plaincopy to clipboardprint?
4. 必須注入對象的每一個屬性值,你可使用{c.*},或者手工寫全全部,但必須是全部屬性。(這個太讓我鬱悶了。
4. 必須注入對象的每一個屬性值,你可使用{c.*},或者手工寫全全部,但必須是全部屬性。(這個太讓我鬱悶了。 view plaincopy to clipboardprint?
使用場合:基於對象的查詢,複雜查詢
使用場合:基於對象的查詢,複雜查詢1.4 多表查詢,返回關聯實體
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)
.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.託管查詢可使用投影,只查詢指定的列屬性