createSQLQuery获取对象列表

      在进行对象关系映射时,无论是使用Hibernate Session还是JPA EntityManager,都会有许多的优势,同时也伴随着不少的缺陷,这也就说明了企业架构师为何在这两者之间难以抉择了。JPA EntityManager是Java Persistence API标准的一部分。然而,Hibernate Session提供的许多功能都在JPA specification之上,超越了JPA specification,标准查询功能是一个引人注目的,但JPA 1.0却没有的遗留功能,而Hibernate Envers成了使用Hibernate 4.0 Session对象的强大理由,超越了它的JPA们。

据Emmanuel Bernard说,组织采用Hibernate来执行ORM工作是喜欢的一种选择是使用JPA EntityManager。他是Jboss的数据架构师,也是Hibernate团队一员。因此,如果IT开发人员需要得到基础 Hibernate Session来访问它的附加功能的话,他们应该怎么做?幸运地,JPA规范使提访问基本Hibernate Session成为可能,即使你的应用正在使用JSR-317标准。

JPA 1.0访问Hibernate Session

为也从JPA 1.0 EntityManager中得到Hibernate Session,那么下面的代码是必不可少的:

org.hibernate.Session hibernateSession = (Session)entityManager.getDelegate();

不幸地,这个语法不是完全可移植的,虽然此代码可在Jboss应用服务器上运行良好,但运行在其它平台时,将会出现不可预测的后果。

  JPA 2.0访问Hibernate Session

很幸运,JPA 2.0提供了更好的、更可移植的,更加跨平台的方法,来获取Hibernate Session。代码如下:

Session session = entityManager.unwrap(org.hibernate.Session.class);

就是它了!当与JPA EntityManager一起合作是,获取基本的Hibernate实现类是如此地简单。因此,让此代码成为你的HibernateUtil类的一部分,使永久存储成为可能,与你的实体beans一起工作,成为多态的Hibernate Session,从而允许你利用更多的简洁功能,超越JPA规范,凌驾于JPA之上。

    hibernate 中createQuery与createSQLQuery两者区别是:

前者用的hql语句进行查询,后者可以用sql语句查询

前者以hibernate生成的Bean为对象装入list返回

后者则是以对象数组进行存储

所以使用createSQLQuery有时候也想以hibernate生成的Bean为对象装入list返回,就不是很方便

突然发现createSQLQuery有这样一个方法可以直接转换对象

Query query = session.createSQLQuery(sql).addEntity(XXXXXXX.class);

XXXXXXX 代表以hibernate生成的Bean的对象,也就是数据表映射出的Bean。

相关推荐