JPA 2 CriteriaQuery,使用限制

Men*_*nno 57 java sql persistence jpa limit

我正在使用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();
Run Code Online (Sandbox Code Playgroud)

谁能帮我?

Fra*_*eth 139

Query上定义限制偏移量:

return em.createQuery(query)
         .setFirstResult(offset) // offset
         .setMaxResults(limit) // limit
         .getResultList();
Run Code Online (Sandbox Code Playgroud)

从文档:

TypedQuery setFirstResult(int startPosition)

设置要检索的第一个结果的位置.参数: startPosition - 第一个结果的位置,编号为0

TypedQuery setMaxResults(int maxResult)

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

  • 这并没有解决如何使用javax.persistence.criteria.CriteriaQuery执行此操作的原始问题.接受的解决方案使用现已弃用的createCriteria()函数. (5认同)
  • 确实,此解决方案无法解决使用 JPA 2 时的问题。 (3认同)

Kek*_*nda 7

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

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

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

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

回到问题:

A CriteriaQuery提供了一组可访问的限制 - 例如 - 使用该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);
Run Code Online (Sandbox Code Playgroud)

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

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

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