使用JPQL限制子查询

sui*_*ide 3 orm jpa jpql jpa-2.0

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

select avg(price) from (
      select p.price from Product p order by p.price desc limit 100)
Run Code Online (Sandbox Code Playgroud)

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

select avg(p.price) from Product p where p.id = 
       (select pj.id from Product pj order by pj.price desc limit 100)
Run Code Online (Sandbox Code Playgroud)

这是在限制关键字之前.

我读过JPQL中没有限制.

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

Nay*_*kar 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();
Run Code Online (Sandbox Code Playgroud)

要么

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

如果这不起作用,则必须执行两个查询 - 选择明确排序的记录然后平均它们.

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