Лимит в подзапросе с JPQL - PullRequest
3 голосов
/ 16 мая 2011

Я бы хотел получить среднюю цену моих 100 лучших продуктов через JPA2.Запрос должен выглядеть примерно так (мой 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 ]

5 голосов
/ 16 мая 2011

LIMIT - это , а не , поддерживаемый JPQL. Ниже приведен пример кода с использованием 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();

Если это не сработает, нужно выполнить два запроса - выбрать однозначно упорядоченные записи и затем усреднить их.

В противном случае используйте собственный запрос, если переносимость не является проблемой, может выполнить то же самое с помощью одного запроса, так как многие СУБД поддерживают ограничение количества результатов, выбираемых из базы данных.

0 голосов
/ 16 мая 2011
SELECT AVG(SELECT PRICE FROM PRODUCT ORDER BY PRICE DESC LIMIT 100) 

См. публикацию относительно обхода JPQL LIMIT.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...