我使用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();
谁能帮我?
定义限制和抵消的查询 :
return em.createQuery(query)
.setFirstResult(offset) // offset
.setMaxResults(limit) // limit
.getResultList();
从文档:
TypedQuery setFirstResult(INT指定startPosition)
设置的第一个结果要检索的位置。 参数: 指定startPosition -第一个结果的位置,从0开始编号
TypedQuery setMaxResults(INT maxResult)
结果集检索的最大数量。
为了完整起见,我要回答与问候到JPA标准API最初的问题。
首先 ,你可以澄清自己事先何时使用JPQL以及何时使用Criteria API取决于使用情况。 在灯架上有一个很好的文章在ObjectDB文档网站的规定:
使用标准的API的主要优点是,错误可以在编译过程中,而不是在运行时被及早发现。 在另一方面,对于许多开发者基于字符串的JPQL查询,这非常类似于SQL的查询,更易于使用和理解。
我推荐这篇文章中一般,因为它描述简洁如何使用JPA标准API。 有关于类似的文章查询API 。
回到刚才的问题 :
一个CriteriaQuery
提供了一组可以访问限制-例如-通过使用where()
方法。 正如你可能猜到直观:你不能限制查询与这样的限制导致特定数量的 - 除非你有一个简单的情况下,例如限制在一个唯一的标识符(这将使该标准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);
然后使用JPA Query
构造函数CriteriaQuery
的对象:
Query limitedCriteriaQuery = getEntityManager().createQuery(criteriaQuery)
.setMaxResults(resultLimit); // this is the important part
return limitedCriteriaQuery.getResultList();
这基本上是你应该如何根据文档和系统提供的文章使用两个API。