我使用的是JPA2。出于安全原因,我使用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();
有谁可以帮我?
发布于 2012-07-26 02:10:12
发布于 2018-06-06 16:52:46
为了完整起见,我想回答关于JPA Criteria API的最初问题。
JPQL首先是,您可以根据用例预先明确何时使用JPQL以及何时使用Criteria 。在ObjectDB documentation网站上有一篇关于这一点的好文章,它说:
使用criteria API的一个主要优点是,可以在编译期间而不是在运行时更早地检测到错误。另一方面,对于许多开发人员来说,基于字符串的JPQL查询更容易使用和理解,它与SQL查询非常相似。
我一般推荐这篇文章,因为它简要地描述了如何使用JPA Criteria API。还有一篇关于Query API的类似文章。
回到问题
例如,通过使用where()
方法,CriteriaQuery
提供了一组可以访问的限制。正如您可能直观地猜测到的那样:您不能使用这样的限制将查询限制到特定数量的结果-除非您有限制唯一标识符这样的琐碎情况(这将使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的方法。
https://stackoverflow.com/questions/11655870
复制相似问题