繁体   English   中英

JPA 2 CriteriaQuery,使用限制

[英]JPA 2 CriteriaQuery, using a 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();

谁能帮我?

Query上定义限制偏移量

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

从文档:

TypedQuery setFirstResult(int startPosition)

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

TypedQuery setMaxResults(int maxResult)

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

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

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

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

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

回到问题

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);

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM