準備:
兩個表(實體), 1對多雙向關(guān)聯(lián):
班級: Clazz (id, name)
學生: Student(id, name , class_id)
1. 查詢持久化對象
1.1 簡單查詢,返回數(shù)據(jù)庫結(jié)構(gòu)
- 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();
特別注意:返回結(jié)果是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. 查詢出來的持久態(tài)對象,clazz對象的studets屬性是各代理對象,訪問的時候才會去查詢DB 使用場合:基于對象的查詢,但對象簡單查詢
1.3 多表查詢,返回多個實體
- 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();
- 特別注意:
- 1. addEntity方法指定了當前返回實體的別名,而且在SQL語句里使用{c.*}這樣的語句,
- 它的意思是向別名為c的這個對象注入所有屬性值.
特別注意:
1. addEntity方法指定了當前返回實體的別名,而且在SQL語句里使用{c.*}這樣的語句,
它的意思是向別名為c的這個對象注入所有屬性值.
- 2. 這個查詢會返回一個Object的List,每個Object包含兩個對象一個Clazz,一個Student
- 3. {}占位符里是對象的屬性,而非列名,如{s.class},而非{s.class_id}
- 4. 必須注入對象的每個屬性值,你可以使用{c.*},或者手工寫全所有,但必須是所有屬性。(這個太讓我郁悶了。
1.4 多表查詢,返回關(guān)聯(lián)實體
- 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();
- <p>特別注意: 這塊有些問題,明明應該返回Clazz的List的,但確返回包含Clazz和Student的Object的List, faint</p><p>使用場合:基于對象的查詢,復雜查詢</p>
2. 查詢托管對象
- 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. 如果不設(shè)置addScalar方法可能會報轉(zhuǎn)型錯誤的異常.
2.托管查詢可以使用投影,只查詢指定的列屬性