1.使用SQLQuery
對原生SQL查詢執(zhí)行的控制是通過SQLQuery接口進行的,通過執(zhí)行Session.createSQLQuery()獲取這個接口。最簡單的情況下,
可以采用以下形式:
List cats = sess.createSQLQuery("select * from cats")
.addEntity(Cat.class)
.list();
這個查詢指定了:
SQL查詢字符串
查詢返回的實體
這里,結(jié)果集字段名被假設(shè)為與映射文件中指明的字段名相同。對于連接了多個表的查詢,這就可能造成問題,因為可能在多
個表中出現(xiàn)同樣名字的字段。下面的方法就可以避免字段名重復(fù)的問題:
List cats = sess.createSQLQuery("select {cat.*} from cats cat")
.addEntity("cat", Cat.class)
.list();
這個查詢指定了:
SQL查詢語句,它帶一個占位符,可以讓Hibernate使用字段的別名.
查詢返回的實體,和它的SQL表的別名.
addEntity()方法將SQL表的別名和實體類聯(lián)系起來,并且確定查詢結(jié)果集的形態(tài)。
addJoin()方法可以被用于載入其他的實體和集合的關(guān)聯(lián).
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查詢可能返回一個簡單的標(biāo)量值或者一個標(biāo)量和實體的結(jié)合體。
Double max = (Double) sess.createSQLQuery("select max(cat.weight) as maxWeight from cats cat")
.addScalar("maxWeight", Hibernate.DOUBLE);
.uniqueResult();
除此之外,你還可以在你的hbm文件中描述結(jié)果集映射信息,在查詢中使用。
List cats = sess.createSQLQuery(
"select {cat.*}, {kitten.*} from cats cat, cats kitten where kitten.mother = cat.id"
)
.setResultSetMapping("catAndKitten")
.list();
2.命名SQL查詢
可以在映射文檔中定義查詢的名字,可以象調(diào)用一個命名的HQL查詢一樣直接調(diào)用命名SQL查詢.在這種情況下,不需要調(diào)用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();
在sping里面用回調(diào)查詢
??? public List getPaysByBizId(final String bizId) {???????
??? return (List)getHibernateTemplate().execute(new HibernateCallback(){???????????
??? public Object doInHibernate(Session session)throws HibernateException{???????????????
??? Query query = session.getNamedQuery("find.pays.by.bizid");???????????????
??? query.setParameter("bizId",bizId);???????????????
??? return query.list();???????????
??? }???????
??? },true);???
??? }
?