Hibernate3.2基礎(chǔ)分析
本文向大家介紹Hibernate3.2,可能好多人還不了解Hibernate3.2,沒有關(guān)系,看完本文你肯定有不少收獲,希望本文能教會你更多東西。
1、從Hibernate3.0.x/3.1.x升級到***的Hibernate3.2,一定要注意,Hibernate3.2的很多sql函數(shù)如 count(), sum()的唯一返回值已經(jīng)從Integer變?yōu)長ong,如果不升級代碼,會得到一個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不支持,單個參數(shù)的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的值注射入對應(yīng)的屬性或者字段。但必須注意,對每一個列都必須addScalar("列名")
6、setResultTransformer與addEntity的一個區(qū)別是前者支持查任意的列,后者必須用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
【編輯推薦】