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