为了完整起见,我想回答关于 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 的方式。