JPA 2 CriteriaQuery,使用限制
Posted
技术标签:
【中文标题】JPA 2 CriteriaQuery,使用限制【英文标题】:JPA 2 CriteriaQuery, using a limit 【发布时间】:2012-07-24 05:55:45 【问题描述】:我正在使用 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();
谁能帮帮我?
【问题讨论】:
【参考方案1】:在Query 上定义limit 和offset:
return em.createQuery(query)
.setFirstResult(offset) // offset
.setMaxResults(limit) // limit
.getResultList();
来自文档:
TypedQuery setFirstResult(int startPosition)
设置要检索的第一个结果的位置。参数: startPosition - 第一个结果的位置,从 0 开始编号
TypedQuery setMaxResults(int maxResult)
设置要检索的最大结果数。
【讨论】:
这并没有解决如何使用 javax.persistence.criteria.CriteriaQuery 执行此操作的原始问题。接受的解决方案使用现已弃用的 createCriteria() 函数。 没错,这个解决方案在使用 JPA 2 时没有解决问题。【参考方案2】:为了完整起见,我想回答关于 JPA Criteria API 的最初问题。
首先,您可以根据用例事先说明何时使用 JPQL 以及何时使用 Criteria API。 ObjectDB documentation 网站上有一篇很好的文章,其中指出:
使用条件 API 的一个主要优点是可以在编译期间而不是在运行时更早地检测到错误。另一方面,对于许多开发人员来说,基于字符串的 JPQL 查询与 SQL 查询非常相似,更易于使用和理解。
我一般推荐这篇文章,因为它简洁地描述了如何使用 JPA Criteria API。 Query API也有类似的文章。
回到问题:
CriteriaQuery
提供了一组可访问的限制 - 例如 - 通过使用 where()
方法。正如您可能直观地猜到的那样:您不能通过这样的限制将查询限制为特定数量的结果 - 除非您有一个微不足道的情况,例如限制唯一标识符(这将使 Criteria API 的使用过时)。简单解释:限制不是标准,因此该 api 不涵盖。另请参阅旧但黄金Java EE docs 了解更多详情。
解决方案
但是,您当然可以使用 CriteriaQuery 对象作为 JPQL 查询的基础。因此,首先,您按原样创建 CriteriaQuery:
CriteriaQuery<Product> criteriaQuery =
getEntityManager().getCriteriaBuilder().createQuery(Product.class);
Root<Product> product = criteriaQuery.from(Product.class);
criteriaQuery.select(product);
然后对CriteriaQuery
对象使用JPA Query
构造函数:
Query limitedCriteriaQuery = getEntityManager().createQuery(criteriaQuery)
.setMaxResults(resultLimit); // this is the important part
return limitedCriteriaQuery.getResultList();
这就是您应该根据文档和提供的文章使用这两种 API 的基本方式。
【讨论】:
这也是您可以设置第一个结果的地方。对页面很有用。以上是关于JPA 2 CriteriaQuery,使用限制的主要内容,如果未能解决你的问题,请参考以下文章