我想通过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中没有这个限制。
有关如何做到这一点的任何想法?标准也没关系。
答案 0 :(得分:5)
'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。