JPA 2 CriteriaQuery,使用限制

时间:2012-07-25 18:05:40

标签: java sql jpa persistence 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();

任何人都可以帮助我吗?

2 个答案:

答案 0 :(得分:129)

limit上定义offsetQuery

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

来自文档:

  

TypedQuery setFirstResult(int startPosition)

     

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

     

TypedQuery setMaxResults(int maxResult)

     

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

答案 1 :(得分:5)

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

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

  

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

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

回到问题

CriteriaQuery提供了一组可以访问的限制 - 例如 - 使用where()方法。正如您可能直观地猜测的那样:您不能将查询限制为具有此类限制的特定数量的结果 - 除非您有一个简单的情况,例如限制唯一标识符(这会使Criteria API的使用过时)。简单解释:限制不是标准,因此不在该API范围内。有关更多详细信息,请参阅旧的{gold Java EE docs

<强>解决方案

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

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

然后对Query个对象使用JPA CriteriaQuery构造函数:

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

基本上,您应该根据文档和提供的文章使用这两种API。