使用JPQL限制子查询

时间:2011-05-15 22:00:50

标签: orm jpa jpa-2.0 jpql

我想通过JPA2获得我的前100个产品的平均价格。查询应该看起来像这样(我的sql有点生锈):

select avg(price) from (
      select p.price from Product p order by p.price desc limit 100)

但这根本不起作用。我也试过这个:

select avg(p.price) from Product p where p.id = 
       (select pj.id from Product pj order by pj.price desc limit 100)

直到limit关键字为止。

我读过JPQL中没有这个限制。

有关如何做到这一点的任何想法?标准也没关系。

2 个答案:

答案 0 :(得分:5)

JPQL支持

'LIMIT' 。以下是使用Criteria-API的示例代码。

CriteriaBuilder builder = entityManager.getCriteriaBuilder();
CriteriaQuery<Double> criteriaQuery = builder.createQuery(Double.class);
Root<Product> productRoot = criteriaQuery.from(Product.class);
criteriaQuery.select(builder.avg(productRoot.get("price")));
criteriaQuery.orderBy(builder.desc(productRoot.get("price"));
Double average = (Double)entityManager.createQuery(criteriaQuery).setMaxResults(100).getSingleResult();

Double average = (Double)entityManager.createQuery("select avg(p.price) from Product p order by p.price").setMaxResults(100).getSingleResult();

如果这不起作用,则必须执行两个查询 - 选择明确排序的记录&amp;然后平均一下。

如果可移植性不是问题,可以使用本机查询,可以使用单个查询完成相同的操作,因为许多RDBMS支持限制从数据库中提取的结果数。

答案 1 :(得分:0)

SELECT AVG(SELECT PRICE FROM PRODUCT ORDER BY PRICE DESC LIMIT 100) 

有关JPQL LIMIT的工作原理,请参阅此post