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 的 BigInteger
和 BigDecimal
后缀语法也已标准化。
新文档资料
已添加了 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 指南。
动态子查询获取支持
@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' );
}};