`

Hibernate SQLQuery:addEntity & addScalar

阅读更多
使用它们时的注意:
1.Query 没有addScalar()和addEntity()方法,使用Query的子接口SQLQuery才有这两个方法
2.如果查询的结果集的字段为多个,如:
String sql = "select id as \"id\",iata as \"iata\",flight as \"flight\",dest as \"dest\",domint as \"domint\" " +
			" ,sdt as \"sdt\",task_nature as \"taskNature\",est_date as \"estDate\",act_date as \"actDate\",remark as \"remark\" " +
			" from FIDS_DEPF";
则如果只
addScalar("sdt", Hibernate.TIMESTAMP)(之所以为Date类型的sdt做addScalar操作,是因为不做这个操作的情况下会有时分秒丢失情况的发生):
this.getSessionFactory().getCurrentSession().createSQLQuery(sql)
				.addScalar("sdt", Hibernate.TIMESTAMP)
				.setResultTransformer(Transformers.aliasToBean(FidsDepfDto.class))
				.list();  
则返回的FidsDepfDto 的list结果集中,将只用sdt有值,其他都为null!所以,在使用addScalar()时,select的每个字段都必须要addScalar()!


addEntity和ResultTransformer 的区别:
addEntity(Class clazz)的参数Clazz必须是被hibernate管理的持久化bean!否则会报MappingException: Unknown entity。如下面代码是不行的(这里的FidsDepfDto是一个不受hibernate管理的非持久化对象(just a dto,not PO!))
this.getSessionFactory().getCurrentSession().createSQLQuery(sql).addEntity(FidsDepfDto.class)

而ResultTransformer可以接受一个任意的bean,只要这个bean的属性(严格说是setXxx()中的xxx)与select的结果集列名存在对应关系:
http://docs.jboss.org/hibernate/core/3.3/reference/en/html/querysql.html#d0e13904
引用
It is possible to apply a ResultTransformer to native SQL queries, allowing it to return non-managed entities.




分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics