Hibernate 6.3.0(和6.2.8)

发布者:    |       Hibernate ORM 发布

Hibernate ORM 6.3.0 已正式发布。同时,6.2.8 也已发布

注意

随着 6.3.0 的发布,6.2 现已进入有限维护阶段。

Java Persistence API 3.2

Java Persistence API 3.2 仍在开发中,但我们已经将其中一些更改纳入 Hibernate。

在 6.3 中需要注意的一个具体更改是关于 HQL/JPQL 查询中数值字面量的类型的澄清。您可以查看详细信息,但主要意思是 -

  • 整数 - 123

  • 长整型 - 123l, 123L

  • 大整数 - 123bi, 123BI

  • 双精度浮点型 - 123.4

  • 浮点字面量 - 123.4f, 123.4F

  • 大数值字面量 - 123.4bd, 123.4BD

请注意,Hibernate 的 BigIntegerBigDecimal 后缀语法也已标准化。

新文档资料

已添加了 2 个新的文档指南 -

查询方法

Hibernate 现在可以生成 DAO 风格的方法作为其 JPA 静态元模型生成器的一部分。

以下是一个示例实体

@NamedQuery(name = "#findByTitleAndType",
        query = "select book from Book book where book.title like :titlePattern and book.type = :type")
@Entity
public class Book { ... }

经过元模型生成器的处理后,Hibernate 添加以下内容到静态元模型

class Book_ {
    // as normal
    ...

    public static final String QUERY_FIND_BY_TITLE_AND_TYPE = "#findByTitleAndType";

    public static List<Book> findByTitleAndType(@Nonnull EntityManager entityManager, String titlePattern, Type type) {
        return entityManager.createNamedQuery(QUERY_FIND_BY_TITLE_AND_TYPE)
                .setParameter("titlePattern", titlePattern)
                .setParameter("type", type)
                .getResultList();
    }
}

然后应用程序可以使用

List<Book> books =
        Book_.findByTitleAndType(entityManager, titlePattern, Type.BOOK);

这些查询方法有很多功能;请参阅Hibernate 6 指南进行完整讨论。

查找方法

使用新的 @Find 注解,现在可以由生成器处理任意方法以创建类似于查询方法的查找方法。

interface Dao {
    @Find
    Book findBookByIsbn(String isbn);
}

生成器将生成

class Dao_ {
        public static Book findBookByIsbn(@Nonnull EntityManager entityManager, String isbn) {
                return entityManager.unwrap(Session.class)
                                .byNaturalId(Book.class)
                                .using(Book_.isbn, isbn)
                                .load();
        }
}

再次强调,这些查找方法有很多功能;有关完整讨论,请参阅Hibernate 6 指南

动态子查询获取支持

Hibernate 的 子查询获取样式现在可以通过 获取配置文件 动态应用。例如:

@FetchProfile(name = "EagerBook")
@FetchProfile(name = "EagerBookWithSubselect")
@Entity
class Book {
    ...

    @ManyToMany
    @FetchProfileOverride(profile = Book_.PROFILE_EAGER_BOOK, mode = JOIN)
    @FetchProfileOverride(profile = Book_.PROFILE_EAGER_BOOK_WITH_SUBSELECT, mode = SUBSELECT)
    Set<Author> authors;
}

然后,在运行时,我们可以选择这些配置文件以控制关联的加载方式 -

Session session = ...;

session.enableFetchProfile( Book_.PROFILE_EAGER_BOOK );
// or
session.enableFetchProfile( Book_.PROFILE_EAGER_BOOK_WITH_SUBSELECT );
注意

那些 Book_.PROFILE_EAGER_BOOK 引用是什么意思?请参阅Hibernate 6 指南

从 HQL 创建 Criteria

6.3 版本添加了从 HQL 创建 Criteria 引用的功能 -

var builder = session.getFactory().getCriteriaBuilder();
var hqlCriteria = session.getFactory()
        .getCriteriaBuilder()
        .createQuery( "select id, text from Message order by received", Object[].class );

它就像任何 Criteria 一样可以修改...

var root = hqlCriteria.getRootList().get(0)
root.where(
    builder.equal(
        root.get(Message_.deleted),
        'Y'
    )
);

CriteriaDefinition 工具

新的 CriteriaDefinition 类是一个工具,用于在许多情况下更容易地使用 Jakarta Persistence Criterias。例如:

var query = new CriteriaDefinition<>(factory, Message.class) {{
    var message = from(Message.class);
    where(like(message.get("text"), "hell%"), message.get("id").equalTo(1));
    orderBy(asc(message.get("id")));
}};

Session session = ...;
var message = session.createSelectionQuery(query).getSingleResult();

我们甚至可以用它来清理从 HQL 创建 Criteria 的示例 -

var query = new CriteriaDefinition<>(factory, Object[].class, "select id, text from Message order by received") {{
    var root = getRootList().get(0);
    where( equal( root.get(Message_.deleted), 'Y' );
}};

StatelessSession.upsert()

新的 StatelessSession.upsert() 方法允许在 Hibernate StatelessSession 中执行 SQL 风格的 UPSERT/MERGE 操作。

// insert it
ss.upsert(new Widget(1, "the nema"));
// update it
ss.upsert(new Widget(1, "the name"));

社区

有关更多详细信息,请参阅

有关联系我们,请访问网站


返回顶部