Получить минимальное и максимальное значения столбца с помощью одного запроса

Как получить значение min и max, используя jpa, а не используя собственный запрос?

Результат должен быть получен с помощью одной транзакции.

Относительный запрос sql:

SELECT min(price), max(price) FROM product

Я пробовал использовать этот код

criteria.setProjection(Projections.min("price"));
Integer min = (Integer) criteria.uniqueResult();
...
criteria.setProjection(Projections.max("price"));
Integer max = (Integer) criteria.uniqueResult();

но это кажется слишком странным, чтобы выполнять его дважды.

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
0
1 694
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Используйте список проекций:

criteria.setProjection(
  Projections.projectionList()
    .add(Projections.min("price"))
    .add(Projections.max("price"))
);
Ответ принят как подходящий

Что ж, вам нужно использовать ProjectionList с вашим Criteria.

Ваш код будет выглядеть так:

criteria.setProjection(
     Projections.projectionList()
    .add(Projections.min("price"))
    .add(Projections.max("price"))
);
Object[] minMax = criteria.uniqueResult();
Integer min = (Integer) minMax[0];
Integer max = (Integer) minMax[1];

Другой вариант - использовать HQL с min и maxАгрегатные функции:

Query q = session.createQuery("select min(prd.price), max(prd.price) from Product prd");
Object[] minMax = q.getSingleResult();
Integer min = (Integer) minMax[0];
Integer max = (Integer) minMax[1];

Я бы предпочел использовать ProjectionList, но теперь моя проблема заключается в том, как я могу сопоставить минимальную максимальную цену напрямую с сущностью Produce, есть два свойства, касающихся minPrice и maxPrice; пытался ли я с criteria = session.createCriteria(Product.class), но безуспешно.

The Hunter 19.07.2018 11:25

@TheHunter Не могли бы вы обновить свой вопрос, указав свои сущности? У вас есть сущность "Продукт", и вы хотите получить в результате другую сущность?

cнŝdk 19.07.2018 11:33

извините за опечатку, я бы предпочел сопоставить результат с сущностью Product, если это невозможно, не беспокойтесь @ chŝdk - спасибо за ответ, это все, что мне нужно.

The Hunter 19.07.2018 11:41

Другие вопросы по теме