Как создать запрос с условием сравнения параметров с JPA?

#java #spring #hibernate #jpa

Вопрос:

Я хочу создать запрос, который будет выбирать баннеры по полю ReqName категории, и если в категории более одного баннера, то отобразите баннер с большим полем цены.

Я использую запрос JPA. Мне удалось создать запрос, который выбирает баннеры по имени категории и отображает текст. Могу ли я использовать JPA, не прибегая к спецификации, чтобы сделать такой запрос, описанный выше?

Хранилище:

 List<Banner> findByCategoryReqName(String req_name); 
 

Тест:

 Iterable<Banner> test = bannerRepository.findByCategoryReqName("First");
test.forEach(t-> System.out.println(t.getText()));
 

Выход:

 SecondSecondSecondSecondSecondSecondSecondSecondSecondSecondSecondSecondSecondSecondSecondSecond
FirstFirstFirstFirstFirstFirstFirstFirstFirstFirstFirstFirstFirstFirstFirstFirstFirstFirstFirst
 

Комментарии:

1. Как определяется ваша модель? И не могли бы вы уточнить свой вопрос? Я не понимаю, в чем ваша проблема.

Ответ №1:

Вы можете попробовать использовать следующий запрос jpa:

 @Query("select b from Banner b where b.category.reqName = :reqName and b.price >= all (select ban.price from Banner ban where ban.category.reqName = :reqName) ")
List<Banner> findByCategoryReqName(@Param("reqName") String req_name); 
 

См.Этот раздел документации по гибернации.

Запрос выглядит не очень эффективным, но, похоже, для повышения эффективности вам следует написать собственный sql-запрос.

Как указано в спецификации jpa 2.2:

Подзапросы могут использоваться в WHERE предложении или HAVING . Подзапросы ограничены WHERE HAVING пунктами и в этом выпуске. Поддержка подзапросов в FROM предложении будет рассмотрена в более позднем выпуске этой спецификации.