Java JPA 2标准查询,使用限制
我正在使用JPA2。出于安全原因,我使用CriteriaQuery实现类型安全(因此,我不会搜索任何类型查询的解决方案等等) 我最近遇到一个问题,我需要设置一个SQL限制 经过大量的搜索,我仍然没有成功地找到解决方案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.
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();