Hibernate 3.2 為兼容 JPA 規範,將 count()、sum() 等聚合函數的唯一返回值從 Integer 改為 Long。直接升級會導致 ClassCastException。
Configuration classicCfg = new Configuration();
classicCfg.addSqlFunction("count", new ClassicCountFunction());
classicCfg.addSqlFunction("avg", new ClassicAvgFunction());
classicCfg.addSqlFunction("sum", new ClassicSumFunction());
SessionFactory classicSf = classicCfg.buildSessionFactory();
// ❌ 舊代碼:升級後拋 ClassCastException
int count = ((Integer) q.uniqueResult()).intValue();
// ✅ 新代碼:兼容 3.0/3.1/3.2 所有版本
int count = ((Number) q.uniqueResult()).intValue();
// Number 是 Integer/Long/Double 等的父類,安全轉型
| 變更項目 | 3.0.5 行為 | 3.2 行為 | 遷移建議 |
|---|---|---|---|
| ehcache 版本要求 | 1.1.x | 強制 1.2+ | 升級 ehcache.jar |
| SQL 批量更新 | 不支援 executeUpdate() | 支援 session.createSQLQuery(sql).executeUpdate() | 可簡化批量操作代碼 |
| 標量查詢 | 需 .addScalar("col", Hibernate.DOUBLE) | 不再需要 addScalar | 移除冗餘代碼 |
| addEntity 單參數 | 不支援 | 支援 .addEntity(Class) | 簡化實體映射 |
| 原生 SQL ResultTransformer | 不支援 | 支援 返回非受管實體 | 參見下文新特性 |
// 返回非受管的 CatDTO 列表
List<CatDTO> dtos = sess.createSQLQuery(
"SELECT NAME, BIRTHDATE FROM CATS"
).setResultTransformer(Transformers.aliasToBean(CatDTO.class))
.list();
// 或使用顯式構造器
.setResultTransformer(new AliasToBeanResultTransformer(CatDTO.class))
注意:每個查詢列必須對應 DTO 屬性名,建議在 SQL 中用別名 SELECT name AS name, birthdate AS birthDate。
List<Map> results = s.createQuery(
"select e.student.name as studentName, " +
"e.course.description as courseDescription " +
"from Enrolment as e"
).setResultTransformer(Transformers.ALIAS_TO_MAP)
.list();
for (Map row : results) {
String name = (String) row.get("studentName");
String desc = (String) row.get("courseDescription");
}
適用於 Criteria、HQL、Native SQL,避免 Object[] 索引訪問的脆弱性。
SELECT a, b FROM ...SELECT * 或 SELECT {a.*}, {b.*} FROM a, b ... 完整實體列(Integer) q.uniqueResult() 替換為 (Number) q.uniqueResult()ehcache-1.2.x.jar 並更新配置文件結構addScalar() 調用executeUpdate() 簡化批量更新/刪除代碼ResultTransformer 替換手動 Object[] 映射邏輯Hibernate 3.2 的核心變更集中在 JPA 兼容性(返回類型統一)與 API 現代化(ResultTransformer、簡化標量查詢)。採用 Number 統一轉型策略可零成本兼容舊版本,新特性則能顯著減少樣板代碼。建議在升級前備份配置與依賴,分模塊驗證核心查詢邏輯。