1,從Hibernate 3.0.x/3.1.x升級到最新的3.2版,一定要注意,3.2版的很多sql函數如count(), sum()的唯一返回值已經從Integer變為Long,如果不升級代碼,會得到一個ClassCastException。
這個變化主要是為了兼容JPA,可以在hibernate.org的最新文檔中找到說明。
Hibernate Team也提供了一個與原來兼容的解決方案:
? Configuration classicCfg = new Configuration();
? classicCfg.addSqlFunction( "count", new ClassicCountFunction());
? classicCfg.addSqlFunction( "avg", new ClassicAvgFunction());
? classicCfg.addSqlFunction( "sum", new ClassicSumFunction());
? SessionFactory classicSf = classicCfg.buildSessionFactory();
或
int?count?=?((Integer)q.uniqueResult()).intValue();
改成?int?count?=?((Number)q.uniqueResult()).intValue();?這樣就可以兩個版本同時兼容.
2,hibernate3.2要求ehcache1.2
3,session.createSQLQuery(sql).executeUpdate();這個hibernate3.0.5不支持,而hibernate3.2支持
? session.createSQLQuery(fsql).addScalar("singlevalue",
??? ??? ??? ??? ??? ??? Hibernate.DOUBLE).uniqueResult();這個到了3.2就不需要addScalar了.
4,session.createSQLQuery(sql).addEntity(Class class);hibernate3.0.5不支持,單個參數的addEntity方法
5,hibernate3.2可以對原生sql 查詢使用ResultTransformer。這會返回不受Hibernate管理的實體。
sess.createSQLQuery("SELECT NAME, BIRTHDATE FROM CATS")
??????? .setResultTransformer(Transformers.aliasToBean(CatDTO.class))
或setResultTransformer(new AliasToBeanResultTransformer(CatDTO.class))
上面的查詢將會返回CatDTO的列表,它將被實例化并且將NAME和BIRTHDAY的值注射入對應的屬性或者字段。
http://bbs.xml.org.cn/blog/more.asp?name=lhwork&id=15351
但必須注意,對每一個列都必須addScalar("列名")
6,setResultTransformer與addEntity的一個區別是前者支持查任意的列,后者必須用select * from users的形式或select {a.*},{b.*} from a,b where ....。
7,Map vs. Object[]
Since you can also use a transformer that return a Map from alias to
value/entity (e.g. Transformers.ALIAS_TO_MAP), you are no longer
required to mess with index based Object arrays when working with a
result.
List iter = s.createQuery(
"select e.student.name as studentName," +
" e.course.description as courseDescription" +
"from Enrolment as e")
.setResultTransformer( Transformers.ALIAS_TO_MAP )
.iterate();
String name = (Map)(iter.next()).get("studentName");
Again, this works equally well for Criteria, HQL and native SQL.
?