JPA 2 CriteriaQuery,使用限制

2022-08-31 13:15:41

我正在使用 JPA 2。出于安全原因,我正在使用CruitaryQuery的类型安全工作(因此,我没有搜索类型查询等的任何解决方案)。

我最近遇到了一个需要设置SQL-LIMIT的问题。

经过大量的搜索,我仍然没有成功地找到解决方案。

CriteriaQuery<Product> query = getEntityManager().getCriteriaBuilder().createQuery(Product.class);
Root<Product> product = query.from(Product.class);
query.select(product);

return em.createQuery(query).getResultList();

任何人都可以帮我吗?


答案 1

查询上定义限制偏移量

return em.createQuery(query)
         .setFirstResult(offset) // offset
         .setMaxResults(limit) // limit
         .getResultList();

从文档中:

TypedQuery setFirstResult(int startPosition)

设置要检索的第一个结果的位置。参数:开始位置 - 第一个结果的位置,编号从 0 开始

TypedQuery setMaxResults(int maxResult)

设置要检索的最大结果数。


答案 2

为了完整起见,我想回答有关 JPA 标准 API 的初始问题。

首先,您可以事先澄清何时使用 JPQL 以及何时使用标准 API,具体取决于用例。在ObjectDB文档网站上有一篇关于此的好文章,其中指出:

使用标准 API 的一个主要优点是,可以在编译期间而不是在运行时更早地检测到错误。另一方面,对于许多开发人员来说,基于字符串的JPQL查询与SQL查询非常相似,更易于使用和理解。

总的来说,我推荐这篇文章,因为它简明扼要地描述了如何使用JPA标准API。有一篇关于查询 API 的类似文章。

回到问题

提供了一组限制,例如,可以使用该方法访问这些限制。正如您可能直观地猜测的那样:您无法通过此类限制将查询限制为特定数量的结果 - 除非您有一个微不足道的情况,例如限制唯一标识符(这将使标准API的使用过时)。简单地解释:限制不是一个标准,因此不被该api所涵盖。另请参阅旧的但金色的 Java EE 文档以获取更多详细信息。CriteriaQuerywhere()

溶液

但是,您当然可以使用 CriteriaQuery 对象作为 JPQL 查询的基础。因此,首先,按原样创建 CriteriaQuery:

CriteriaQuery<Product> criteriaQuery = 
    getEntityManager().getCriteriaBuilder().createQuery(Product.class);
Root<Product> product = criteriaQuery.from(Product.class);
criteriaQuery.select(product);

然后对对象使用 JPA 构造函数:QueryCriteriaQuery

Query limitedCriteriaQuery = getEntityManager().createQuery(criteriaQuery)
     .setMaxResults(resultLimit); // this is the important part     
return limitedCriteriaQuery.getResultList();

这基本上就是您应该如何根据文档和提供的文章使用这两个API。


推荐