hibernate中的addEntity setResultTransformer的比较

如果使用原生sql语句进行query查询时,hibernate是不会自动把结果包装成实体的。
所以要手动调用addEntity(Class class)等一系列方法。
1、session.createSQLQuery(sql).addEntity(Class class);
      注意hibernate3.0.5不支持单个参数的addEntity方法
2、session.createSQLQuery(sql).setResultTransformer(Transformers.aliasToBean(Clazz.class))
      或者setResultTransformer(new AliasToBeanResultTransformer (Clazz.class))
      返回不受Hibernate管理的实体。
上面的查询将会返回Clazz的列表,它将被实例化并且将列表项的值注射入对应的属性或者字段。
http://bbs.xml.org.cn/blog/more.asp?name=lhwork&id=15351
但必须注意,对每一个列都必须addScalar("列名")
既然如此,那么setResultTransformer与addEntity的区别是什么呢?
前者支持查任意的列,后者必须用select * from users的形式或select {a.*},{b.*} from a,b where ....。

查询托管对象

String      sql    = "select c.* from Clazz c ";

List<Clazz> clazzs = (List<Clazz>) session.createSQLQuery(sql).addEntity(clazz).list();

String      sql    = "select c.id from Clazz c ";

List<Clazz> clazzs = (List<Clazz>) session.createSQLQuery(sql).addScalar("id", Hibernate.LONG).addScalar("name", Hibernate.STRING)                       .setResultTransformer(Transformers.aliasToBean(Clazz.class)).list();特别注意:1. 如果不设置addScalar方法可能会报转型错误的异常.2.托管查询可以使用投影,只查询指定的列属性

总结:

hibernate实体类用addEntity

不受Hibernate管理的实体类用setResultTransformer

时间: 2024-10-13 02:42:33

hibernate中的addEntity setResultTransformer的比较的相关文章

使用SQLQuery 在Hibernate中使用sql语句

session.createSQLQuery.转载 对原生SQL查询执行的控制是通过SQLQuery接口进行的,通过执行Session.createSQLQuery()获取这个接口.下面来描述如何使用这个API进行查询. 1.标量查询(Scalar queries) 最基本的SQL查询就是获得一个标量(数值)的列表. sess.createSQLQuery("SELECT * FROM CATS").list();sess.createSQLQuery("SELECT ID,

(转)Hibernate中的Query一些基本用法

/*** 添加*/public void save(Stu stu){ try { tran=this.GetSession().beginTransaction(); this.GetSession().save(stu); tran.commit(); } catch (HibernateException e) { throw e; }finally{ this.CloseSession(); }} /*** 使用HQL全查询*/public List getallbyHQL(){ Lis

Hibernate 中createQuery与createSQLQuery

本文原址 : http://stta04.javaeye.com/blog/377633 hibernate 中createQuery与createSQLQuery 昨晚帮同事看代码到凌晨2点多,今早6点醒来发现他发来信息说报空指针错误,实在无法入睡,起来自己测试了一下,控制台还真的报: 2009-4-25 8:12:34 org.apache.catalina.core.ApplicationContext log信息: java.lang.ClassCastException: [Ljava

hibernate(七) hibernate中查询方式详解

序言 之前对hibernate中的查询总是搞混淆,不明白里面具体有哪些东西.就是因为缺少总结.在看这篇文章之前,你应该知道的是数据库的一些查询操作,多表查询等,如果不明白,可以先去看一下 MySQL数据表查询操作详解  ,以至于看这篇文章不用那么吃力. --WH 一.hibernate中的5种检索方式 1.1.导航对象图检索方式 根据已经加载的对象导航到其他对象 例如:在前面的各种映射关系中,实体类包含对其他类对象的引用. Dept d = (Dept) session.get(Dept.cla

hibernate 中createQuery与createSQLQuery两者区别

hibernate 中createQuery与createSQLQuery两者区别是:前者用的hql语句进行查询,后者可以用sql语句查询前者以hibernate生成的Bean为对象装入list返回,后者则是以对象数组进行存储所以使用createSQLQuery有时候也想以hibernate生成的Bean为对象装入list返回,就不是很方便突然发现createSQLQuery有这样一个方法可以直接转换对象Query query = session.createSQLQuery(sql).addE

关于hibernate中多对多关系

关于多对多关系 数据库:在使用多对多的关系时,我们可以使用复合主键.也可以不使用,直接引入外键同样可以实现. 在数据库中使用多对多关系时,需要一个中间表. 多对多关系中的数据库结构如下: 表:Orders 字段:orderid(主键)..... 表:Users 字段:usersid(主键),.... 中间表: cy_order_user 字段:cy_order_user主键id 外键:cy_orderid(引入Orders表) 外键:cy_usersid(引入Users表) 注意:中间表的外键是

hibernate 中createQuery与createSQLQuery(转载)

息: java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to com.miracle.dm.doc.catalog.model.DocCatalogInfo 原来的查询语句: String sql = "select a.* from tb_doc_catalog a where a.cat_code like '"+catCode+"%'";Session session = this

JPA或Hibernate中的

JPA执行原生SQL截断Char类型问题 在JPA的API中执行原生SQL:EntityManager.createNativeQuery(String sqlString); 传入参数是原生SQL语句,返回SQL对象. 如果oracle数据库中某个字段定义的是char类型,比方说是char[2],当使用EntityManager.createNativeQuery(String sql); 去查询这些值的时候,发现返回的结果集中只要数据库中是char类型的,都只返回一个字符. 原因:hiber

hibernate中 criteria.setProjection(Projections.rowCount()).uniqueResult()为null的Bug

在hibernate中,在查询总数时,会使用如下方法; public Integer getCount(final DetachedCriteria detachedCriteria) {         return (Integer) getHibernateTemplate().execute(new HibernateCallback() { @Override             public Object doInHibernate(Session session)