1

Hibernate

Hibernate是一个开源的对象关系映射框架(ORM),将Java应用程序中的对象与关系型数据库之间的数据存储和检索进行映射。
Hibernate还提供了一种称为Hibernate Query Language(HQL)的查询语言,这提供了一定程度的数据库独立性。
image.png
以user表为例,通过ORM即可将类中的字段映射为数据库中的表。

查询

数据库查询分为三个步骤:

  1. 创建查询语句
  2. 准备查询语句
  3. 执行查询语句

创建查询语句

先介绍几个缩写:

  • 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实例来表示一个查询。

创建查询
  1. 使用JPQL,从数据库中检索所有的Item实体实例

    Query query = em.createQuery("select i from Item i");

    JPQL的使用与SQL很类似。
    其中em是EntityManager的实例,EntityManager是Java Persistence API(JPA)中的一个接口,用于管理实体对象的生命周期和执行与这些对象相关的持久性操作。它是JPA的核心接口之一,提供了一种将实体对象与数据库进行交互的机制。

  2. 使用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不带有字符串,这意味着查询将是安全的并且包含在重构操作中的。

  3. 使用原生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提供的接口更多,当然移植性会相应变差。

  1. 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 方法用于获取底层的实现对象,以便执行特定于实现的操作。

  1. 较老的专有查询API

    org.hibernate.Criteria query = session.createCriteria(Item.class);
    query.add(org.hibernate.criterion.Restrictions.eq("id", ITEM_ID));
  2. 类型转换(JPA.Query => Hibernate.Query)
    给定一个专有的 javax.persistence.Query,可以通过解包一个org.hibernate.jpa.HibernateQuery 来访问Hibernate专有的API

    javax.persistence.Query query = em.createQuery(
     // ...
    );
    
    org.hibernate.Query HibernateQuery = query.unwrap(org.hibernate.jpa.HibernateQuery.class).getHibernateQuery();
    
    hibernateQuery.getQueryString();
    hibernateQuery.getResultAliases();
    // ...

    参考

    《Hibernate 实战》


chshihang
116 声望13 粉丝