75

我正在使用 JPA 2。出于安全原因,我使用 CriteriaQuery 的类型安全(因此,我没有在寻找任何类型化查询的解决方案等等)。

我最近遇到了一个需要设置 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();

谁能帮我?

4

2 回答 2

173

Query上定义限制偏移量

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

从文档中:

TypedQuery setFirstResult(int startPosition)

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

TypedQuery setMaxResults(int maxResult)

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

于 2012-07-25T18:10:12.327 回答
18

为了完整起见,我想回答关于 JPA Criteria API 的最初问题。

首先,您可能会根据用例事先说明何时使用 JPQL 以及何时使用 Criteria API。在ObjectDB 文档网站上有一篇很好的文章,其中指出:

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

我一般推荐这篇文章,因为它简洁地描述了如何使用 JPA Criteria API。有一篇关于Query API的类似文章。

回到问题

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

解决方案

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

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

然后对对象使用 JPAQuery构造函数CriteriaQuery

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

这基本上就是根据文档和提供的文章使用这两种 API 的方式。

于 2018-06-06T08:52:45.653 回答