在进行对象关系映射时,无论是使用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。
相关推荐
在上面的代码中,我们使用 setResultTransformer() 方法将查询结果转换为 Tree 对象,然后使用 list() 方法获取查询结果,最后遍历结果集,使用 Tree 对象来获取每个字段的值。 最后,让我们总结一下 ...
例如,它可能有一个`getMailsByCriteria(String criteria)`方法,该方法根据某些条件(criteria)从邮件表中选择部分字段,并将它们映射为Mail对象列表。 总结起来,Hibernate3通过`createSQLQuery()`方法提供了对...
2. **读取(Read)**: 使用`get()`或`load()`获取对象,或者使用`createQuery()`或`createSQLQuery()`执行HQL(Hibernate Query Language)或SQL查询。 3. **更新(Update)**: 修改对象属性后,调用`update()`方法...
6.1.2 从序列(Sequence)中获取自动增长的标识符 6.2 Java语言按内存地址区分不同的对象 6.3 Hibernate用对象标识符(OID)来区分对象 6.4 Hibernate的内置标识符生成器的用法 6.4.1 increment标识符生成器 ...
例如,使用 session.get() 或 session.load() 方法可以根据 OID 获取对象。 session.get(Customer.class, 1); 三、HQL 检索 HQL 是 Hibernate 最常用的检索方式,它支持所有 SQL 支持的检索方式。HQL 是一种面向...
默认情况下,`createSQLQuery`的结果不会自动映射到任何Java Bean对象,而是以对象数组的形式返回。但在上述的解决思路二中,通过调用`addEntity(DocCatalogInfo.class)`方法,我们可以告诉Hibernate将查询结果映射...
在上面的代码中,我们使用 `Session.createSQLQuery()` 方法创建了一个 `SQLQuery` 对象,然后使用 `addEntity()` 方法指定了查询结果的实体类型,最后使用 `list()` 方法执行查询并获取结果。 使用 ...
4. **加载(get()和load())**:这两者都是用于从数据库中获取对象。get()方法直接返回对象,而load()则返回一个代理对象,只有在需要时才从数据库加载数据,以实现懒加载。 5. **查询(createQuery()、...
这里的`addScalar`方法指定了结果集中两个字段的名称和类型,而`setResultTransformer`则指定了结果转换方式,即将查询结果映射为`SumPlace`对象列表。 ##### 3. 执行查询并获取结果 ```java return (List) query1....
2. 对象列表:使用list()方法,当查询预期返回多行时使用。 ```java List<Note> list = query.list(); ``` 四、自定义结果转换器 默认情况下,SQLQuery的查询结果会映射为Object数组或List[]>。然而,有时我们...
3. **调用存储过程**:在Java代码中,你可以通过SessionFactory获取Session对象,然后使用`Session.createSQLQuery()`或`Session.doWork()`方法来执行存储过程。例如: ```java Session session = sessionFactory...
`HibernateTemplate`是Spring框架对Hibernate的一种封装,提供了一种更简单的API来执行常见的Hibernate操作,比如获取对象、执行HQL查询等。 1. 使用`HibernateTemplate`获取ID为1的对象: ```java SellerAppInfo...
6.1.2 从序列(Sequence)中获取自动增长的标识符 6.2 Java语言按内存地址区分不同的对象 6.3 Hibernate用对象标识符(OID)来区分对象 6.4 Hibernate的内置标识符生成器的用法 6.4.1 increment标识符生成器 ...
6.1.2 从序列(Sequence)中获取自动增长的标识符 6.2 Java语言按内存地址区分不同的对象 6.3 Hibernate用对象标识符(OID)来区分对象 6.4 Hibernate的内置标识符生成器的用法 6.4.1 increment标识符生成器 ...
6.1.2 从序列(Sequence)中获取自动增长的标识符 6.2 Java语言按内存地址区分不同的对象 6.3 Hibernate用对象标识符(OID)来区分对象 6.4 Hibernate的内置标识符生成器的用法 6.4.1 increment标识符生成器 ...
`createQuery()`方法接收HQL语句,返回一个Query对象,然后调用`list()`方法获取所有数据。 2. **使用Criteria API** Criteria API提供了一种更加面向对象的方式来构建查询。查询所有数据的代码如下: ```java ...
最后,执行查询并获取结果列表。 3. **常用的限定方法、链接限定** - Hibernate的查询中,可以使用各种限定条件来过滤数据,如`setParameter()`用于设置参数,`addScalar()`用于指定返回单一列值,`setFirstResult...
Hibernate提供`Session`接口的`createSQLQuery()`方法来创建一个`SQLQuery`对象,用于执行原生的SQL查询。例如,以下代码展示了如何通过Native SQL获取`guestbook`表的所有记录,并打印结果: ```java ...