透過 SQLQuery 介面控制原生 SQL 查詢執行,由 Session.createSQLQuery() 取得。
最簡單形式:
List cats = sess.createSQLQuery("select * from cats")
.addEntity(Cat.class).list();
指定 SQL 查詢字串與回傳實體類別。結果集欄位名假設與映射檔相同。
多表聯結時可能出現同名欄位,使用別名佔位符:
List cats = sess.createSQLQuery("select {cat.*} from cats cat")
.addEntity("cat", Cat.class).list();
addEntity() 關聯 SQL 表別名與實體類別,決定結果集結構。
使用 addJoin():
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();
Double max = (Double) sess.createSQLQuery(
"select max(cat.weight) as maxWeight from cats cat")
.addScalar("maxWeight", Hibernate.DOUBLE)
.uniqueResult();
List cats = sess.createSQLQuery(
"select {cat.*}, {kitten.*} from cats cat, cats kitten where kitten.mother = cat.id")
.setResultSetMapping("catAndKitten")
.list();
在映射檔定義查詢名稱,像命名 HQL 一樣直接呼叫,無需 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();