Как создать запрос с условием сравнения параметров при помощи JPA?
Я хочу создать запрос, который будет выбирать баннеры по полю ReqName категории и, если в категории более одного баннера, отображать баннер с большим полем цены.
Я использую запрос JPA. Мне удалось создать запрос, который выбирает баннеры по категории ReqName и отображает текст. Могу ли я использовать JPA, не прибегая к Specification, чтобы сделать такой запрос, описанный выше?
Repository:
List<Banner> findByCategoryReqName(String req_name);
Test:
Iterable<Banner> test = bannerRepository.findByCategoryReqName("First");
test.forEach(t-> System.out.println(t.getText()));
Вывод:
SecondSecondSecondSecondSecondSecondSecondSecondSecondSecondSecondSecondSecondSecondSecondSecond
FirstFirstFirstFirstFirstFirstFirstFirstFirstFirstFirstFirstFirstFirstFirstFirstFirstFirstFirst
Ответы (1 шт):
Вариантов несколько:
1. Используя синтаксис именования методов
Ближе всего к требуемому (выбрать сущность из заданной категории с максимальной ценой) будет "получить полный список сущностей заданной категории, упорядоченный по цене".
Итого, метод будет выглядеть примерно так:
List<Banner> findByCategoryReqNameOrderByPriceDesc(String req_name);
по выполнению этого метода нужно будет забрать из полученного списка первый элемент (Desc - сортировка по убыванию)
2. Используя синтаксис именования методов и ограничения выдачи результатов
Пункт появился по комментарию @Roman Konoval.
Метод можно задекларировать следующим образом:
Banner findFirstByCategoryReqNameOrderByPriceDesc(String req_name);
Имхо - это будет оптимальный вариант.
3. Используя NativeQuery
Здесь всё зависит от того, какая СУБД используется. К примеру, для MS SQL метод может выглядеть так:
@Query(value = "SELECT TOP 1 * FROM BANNERS WHERE req_name= ?1 ORDER BY Price DESC", nativeQuery = true)
Banner findMaxByCategoryReqName(String req_name); // возможно, лучше использовать Optional<Banner>, если категория может быть пуста.
4. Используя @Query
Возможно, тут тоже можно задействовать что-то вроде TOP 1 или LIMIT 1, но быстрый поиск не нашел упоминаний подобного.