Hibernate 雖然提供了強大的 HQL 查詢語言,但在某些複雜場景(如資料庫特有函數、複雜連接、效能調優)下,仍需直接使用原生 SQL。Hibernate 透過 Session.createSQLQuery() 方法支援原生 SQL 查詢,關鍵在於理解「別名映射」機制,將 SQL 結果集正確映射到持久化實體或標量值。本文基於 Hibernate 2.1.6 版本,深入解析相關 API 與用法。
public Query createSQLQuery(String sql, String returnAlias, Class returnClass)
{alias.*} 佔位符代表實體所有欄位。{alias.*} 中的 alias)。範例:
String sql = "SELECT {cat.*} FROM CAT {cat} WHERE {cat}.ID = ?";
List cats = session.createSQLQuery(sql, "cat", Cat.class)
.setParameter(0, catId)
.list();
public Query createSQLQuery(String sql, String[] returnAliases, Class[] returnClasses)
適用於多表連接查詢,一次取回多種實體物件。
Hibernate 要求在 SQL 中使用 {alias.*} 或 {alias.property} 語法,明確指定欄位屬於哪個別名。這讓 Hibernate 能根據映射檔自動解析欄位名稱、型別轉換,避免手動處理 ResultSet。
建議詳細閱讀 Hibernate 官方參考文檔第 13 章(querysql.html),其中完整說明了:
addScalar())4.1 不要查詢未映射的表或視圖。 原生 SQL 查詢的目標實體必須在 Hibernate 映射檔中定義,否則無法正確映射。
掌握 createSQLQuery 的別名映射機制,是發揮 Hibernate 原生 SQL 查詢威力的關鍵。合理使用原生 SQL 可解決 HQL 難以表達的複雜查詢,同時保持物件關係映射的便利性。