JPA 2 CriteriaQuery中,使用限制(JPA 2 CriteriaQuery, usi

2019-06-26 13:29发布

我使用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();

谁能帮我?

Answer 1:

定义限制和抵消的查询 :

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

从文档:

TypedQuery setFirstResult(INT指定startPosition)

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

TypedQuery setMaxResults(INT maxResult)

结果集检索的最大数量。



Answer 2:

为了完整起见,我要回答与问候到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。



文章来源: JPA 2 CriteriaQuery, using a limit