createsqlquery

来源:http://bbs.xml.org.cn/blog/more.asp?name=lhwork&id=15351


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的值注射入对应的属性或者字段。

但必须注意,对每一个列都必须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.

  1. List iter = s.createQuery(   
  2.   "select e.student.name as studentName," +   
  3.   "       e.course.description as courseDescription" +   
  4.   "from   Enrolment as e")   
  5.   .setResultTransformer( Transformers.ALIAS_TO_MAP )   
  6.   .iterate();  

String name = (Map)(iter.next()).get("studentName");
Again, this works equally well for Criteria, HQL and native SQL.

 

//===========

val sql = "select distinct story as story from ..."; 
val q
: Query = getEntityManager().createNativeQuery(sql); 
//hello nasty hack 
q
.asInstanceOf[HibernateQuery].getHibernateQuery().asInstanceOf[SQLQuery].addScalar("story", StandardBasicTypes.LONG); 
//next, caching   
q
.setHint("org.hibernate.cacheable", true); 
q
.setHint("org.hibernate.cacheRegion", "query.getTopLinks"); 
//=======================

q2.unwrap(SQLQuery.class).addScalar("sc_cur_code", StringType.INSTANCE); 

你可能感兴趣的:(create)