Hibernate
Hibernate是一个开源的对象关系映射框架(ORM),将Java应用程序中的对象与关系型数据库之间的数据存储和检索进行映射。
Hibernate还提供了一种称为Hibernate Query Language(HQL)的查询语言,这提供了一定程度的数据库独立性。
以user表为例,通过ORM即可将类中的字段映射为数据库中的表。
查询
数据库查询分为三个步骤:
- 创建查询语句
- 准备查询语句
- 执行查询语句
创建查询语句
先介绍几个缩写:
- SQL: 结构化查询语言。用来查询数据用的,通过代码指令来实现个性化的数据处理。
- JPQL:Java Persistence Query Language,Java持久性查询语言
- HQL: Hibernate Query Language,Hibernate查询语言。跟JPQL一样是面向对象的查询语言,允许开发人员以对象模型而非数据库模型来编写查询。因为Hibernate实现了JPA规范,其中包括JPQL,所以在很大程度上与JPQL相似。
JPA 查询接口
JPA(Java Persistence API)是Java平台上的一种ORM(对象关系映射)规范,而Hibernate是它的一种实现;
JPA使用Query和TypedQuery实例来表示一个查询。
创建查询
使用JPQL,从数据库中检索所有的Item实体实例
Query query = em.createQuery("select i from Item i");
JPQL的使用与SQL很类似。
其中em是EntityManager的实例,EntityManager是Java Persistence API(JPA)中的一个接口,用于管理实体对象的生命周期和执行与这些对象相关的持久性操作。它是JPA的核心接口之一,提供了一种将实体对象与数据库进行交互的机制。使用CriteriaBuilder 和 CriteriaQuery API创建查询
CriteriaBuilder cb = em.getCriteriaBuilder(); // CriteriaBuilder cb = entityManagerFactory.getCriteriaBuilder(); CriteriaQuery criteria = cb.createQuery(); criteria.select(criteria.from(Item.class)); Query query = em.createQuery(criteria);
使用这种方式创建的CriteriaQuery不带有字符串,这意味着查询将是安全的并且包含在重构操作中的。
使用原生SQL
Query query = em.createNativeQuery( "select * from ITEM", Item.class );
类型化查询结果:
如果使用Query,在查出结果后需要进行类型转换。
Query query = em.createQuery(
"select i from Item i where i.id = :id"
).setParameter("id", ITEM_ID);
Item result = (Item) query.getSingleResult();
使用TypedQuery
TypedQuery<Item> query = em.createQuery(
"select i from Item i where i.id = :id"
).setParameter("id", ITEM_ID);
Item result = query.getSingleResult();
Hibernate的查询结果
Hibernate的查询表达式形式就是org.hibernate.Query和org.hibernate.SQLquery。因为Hibernate是JPA的实现,所以Hibernate提供的接口更多,当然移植性会相应变差。
Hibernate 独有的SQL结果映射工具:
Session session = em.unwrap(Session.class); org.hibernate.SQLQuery query = session.createSQLQuery( "select {i.*} from ITEM {i}" ).addEntity("i", Item.class);
该例中,通过SQL的占位符将java.sql.ResultSet的列映射到实体属性。
在 Hibernate 中,Session 对象是核心的数据访问对象,用于执行数据库操作。unwrap 方法用于获取底层的实现对象,以便执行特定于实现的操作。
较老的专有查询API
org.hibernate.Criteria query = session.createCriteria(Item.class); query.add(org.hibernate.criterion.Restrictions.eq("id", ITEM_ID));
类型转换(JPA.Query => Hibernate.Query)
给定一个专有的 javax.persistence.Query,可以通过解包一个org.hibernate.jpa.HibernateQuery 来访问Hibernate专有的APIjavax.persistence.Query query = em.createQuery( // ... ); org.hibernate.Query HibernateQuery = query.unwrap(org.hibernate.jpa.HibernateQuery.class).getHibernateQuery(); hibernateQuery.getQueryString(); hibernateQuery.getResultAliases(); // ...
参考
《Hibernate 实战》
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。