正如我在this article 中解释的那样,有几种方法可以实现这一目标。
在您的示例中,您使用的是旧版 Hibernate Criteria,但由于它自 Hibernate 4 以来已被弃用,并且可能会在 Hibernate 6 中被删除。
因此,最好使用以下替代方法之一。
请注意,在您的示例中,您在List 类型的pks 变量中定义了实体标识符值,我还将在下面的示例中重用它。
JPQL
您可以使用类似以下的 JPQL 查询:
List<Book> books = entityManager
.createQuery(
"select b " +
"from Book b " +
"where b.id in (:ids)", Book.class)
.setParameter("ids", pks)
.getResultList();
使用 JPQL 时,ids 参数将按照它们在 pks 变量中定义的相同顺序传递实体标识符。
标准 API
如果您想动态构建查询,则可以使用 Criteria API 查询:
CriteriaBuilder builder = entityManager.getCriteriaBuilder();
CriteriaQuery<Book> query = builder.createQuery(Book.class);
ParameterExpression<List> ids = builder.parameter(List.class);
Root<Book> root = query
.from(Book.class);
query
.where(
root.get("id").in(
ids
)
);
List<Book> books = entityManager
.createQuery(query)
.setParameter(ids, pks)
.getResultList();
使用 Criteria API 时,ids 参数将按照它们在 pks 变量中定义的相同顺序传递实体标识符。
Hibernate 特定的 multiLoad
List<Book> books = entityManager
.unwrap(Session.class)
.byMultipleIds(Book.class)
.multiLoad(pks);
默认情况下,Hibernate multiLoad,ids 参数将按照它们在 pks 变量中定义的相同顺序传递实体标识符。仅当您显式调用enableOrderedReturn(false) 时,才会对结果集进行排序。
现在,JPQL 和 Criteria API 也可以从 hibernate.query.in_clause_parameter_padding optimization 中受益,这允许您增加 SQL 语句缓存机制。
有关按标识符加载多个实体的更多详细信息,请查看this article。