使用SQLQuery
對原生SQL查詢執行的控制是經過SQLQuery接口進行的,經過執行Session.createSQLQuery()獲取這個接口。最簡單的狀況下,咱們能夠採用如下形式:sql
List cats
=
sess.createSQLQuery(
"
select * from cats
"
).addEntity(Cat.
class
).list();
這個查詢指定了:app
SQL查詢字符串spa
查詢返回的實體接口
這裏,結果集字段名被假設爲與映射文件中指明的字段名相同。對於鏈接了多個表的查詢,這就可能形成問題,由於可能在多個表中出現一樣名字的字段。下面的方法就能夠避免字段名重複的問題:文檔
List cats
=
sess.createSQLQuery(
"
select {cat.*} from cats cat
"
).addEntity(
"
cat
"
, Cat.
class
).list();
這個查詢指定了: 字符串
SQL查詢語句,它帶一個佔位符,可讓Hibernate使用字段的別名. get
查詢返回的實體,和它的SQL表的別名. it
addEntity()方法將SQL表的別名和實體類聯繫起來,而且肯定查詢結果集的形態。 io
addJoin()方法能夠被用於載入其餘的實體和集合的關聯. class
List cats
=
sess.createSQLQuery(
"
select {cat.*}, {kitten.*} from cats cat, cats kitten where kitten.mother = cat.id
"
)
.addEntity(
"
cat
"
, Cat.
class
)
.addJoin(
"
kitten
"
,
"
cat.kittens
"
)
.list();
原生的SQL查詢可能返回一個簡單的標量值或者一個標量和實體的結合體。
Double max
=
(Double) sess.createSQLQuery(
"
select max(cat.weight) as maxWeight from cats cat
"
)
.addScalar(
"
maxWeight
"
, Hibernate.DOUBLE);
.uniqueResult();
除此以外,你還能夠在你的hbm文件中描述結果集映射信息,在查詢中使用。
List cats
=
sess.createSQLQuery(
"
select {cat.*}, {kitten.*} from cats cat, cats kitten where kitten.mother = cat.id
"
)
.setResultSetMapping(
"
catAndKitten
"
)
.list();
命名SQL查詢
能夠在映射文檔中定義查詢的名字,而後就能夠象調用一個命名的HQL查詢同樣直接調用命名SQL查詢.在這種狀況下,咱們不 須要調用addEntity()方法.
<
sql
-
query name
=
"
persons
"
>
<
return
alias
=
"
person
"
class
=
"
eg.Person
"
/>
Select person.NAME AS {person.name},person.AGE AS {person.age},person.SEX AS {person.sex} FROM PERSON person Where person.NAME LIKE :namePattern
</
sql
-
query
>
List people
=
sess.getNamedQuery(
"
persons
"
).setString(
"
namePattern
"
, namePattern)
.setMaxResults(
50
).list();