Java JPA 2标准查询,使用限制

Java JPA 2标准查询,使用限制,java,sql,jpa,persistence,limit,Java,Sql,Jpa,Persistence,Limit,我正在使用JPA2。出于安全原因,我使用CriteriaQuery实现类型安全(因此,我不会搜索任何类型查询的解决方案等等) 我最近遇到一个问题,我需要设置一个SQL限制 经过大量的搜索,我仍然没有成功地找到解决方案 CriteriaQuery<Product> query = getEntityManager().getCriteriaBuilder().createQuery(Product.class); Root<Product> product = query.

我正在使用JPA2。出于安全原因,我使用CriteriaQuery实现类型安全(因此,我不会搜索任何类型查询的解决方案等等)

我最近遇到一个问题,我需要设置一个SQL限制

经过大量的搜索,我仍然没有成功地找到解决方案

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

return em.createQuery(query).getResultList();
CriteriaQuery query=getEntityManager().getCriteriaBuilder().createQuery(Product.class);
Root product=query.from(product.class);
查询、选择(产品);
返回em.createQuery(query.getResultList();
有人能帮我吗?

在以下页面上定义和:

从文件中:

TypedQuery setFirstResult(int startPosition)

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

TypedQuery setMaxResult(int-maxResult)

设置要检索的最大结果数


为了完整起见,我想回答关于JPA标准API的初始问题

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

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

我一般推荐这篇文章,因为它简明地描述了如何使用JPA标准API。有一篇类似的文章是关于这个问题的

回到问题

CriteriaQuery
提供了一组可以访问的限制,例如,可以使用
where()
方法。正如您可能直观地猜测的那样:您不能使用这样的限制将查询限制为特定数量的结果——除非您有一个简单的情况,比如限制唯一标识符(这会使Criteria API的使用过时)。简单解释:限制不是标准,因此不包含在api中。有关更多详细信息,请参见古老但金色的

解决方案

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

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

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

这并没有解决如何使用javax.persistence.CriteriaQuery实现这一点的原始问题。接受的解决方案使用了现在已弃用的createCriteria()函数。确实,此解决方案在使用JPA 2时没有解决此问题。您也可以在这里设置第一个结果。对页面很有用。
CriteriaQuery<Product> criteriaQuery = 
    getEntityManager().getCriteriaBuilder().createQuery(Product.class);
Root<Product> product = criteriaQuery.from(Product.class);
criteriaQuery.select(product);
Query limitedCriteriaQuery = getEntityManager().createQuery(criteriaQuery)
     .setMaxResults(resultLimit); // this is the important part     
return limitedCriteriaQuery.getResultList();