Как использовать метод параметра в аннотации @Query

Можно ли вызвать метод параметра внутри аннотации @Query?

Пример:

@Query("SELECT user " +
    "FROM User user " +
    "WHERE (?1.getFilter() = '*' OR user.name = ?1)");
List<User> getUsers(UserNameFilter userNameFilter);

Я знаю, что могу сделать что-то вроде этого:

@Query("SELECT user " +
    "FROM User user " +
    "WHERE (?1 = '*' OR user.name = ?1)");
List<User> getUsers(String userName);

Но когда количество фильтров увеличивается, это означает, что мне нужно изменить ряд параметров.

Я не думаю, что это возможно. Вы можете использовать Criteria Api и передать объект Filter.

Jan Ossowski 21.05.2018 13:27
stackoverflow.com/questions/28874135/…
Robert Niestroj 21.05.2018 13:33
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
2
4 124
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

С помощью SpEL вы можете использовать методы bean-компонентов Spring в своих запросах, например

@Query("select e from MyEntity e where ?#{@myBean.myMethod(#param1)} is true")
List<MyEntity> entities = getEntity(@Param("param1") String param);

Вы можете определить свой bean-компонент любым подходящим способом, например:

@Component
public class MyBean {
    public boolean myMethod(String param) {...}
}

Или это может быть даже одно и то же репо:

public interface MyRepo extends JpaRepository<MyEntity, Long> {

    @Query("select e from MyEntity e where ?#{@myRepo.myMethod(#param1)} is true")
    List<MyEntity> entities = getEntity(@Param("param1") String param);

    default boolean myMethod(String param) {...}
}

Также вы можете использовать свойства параметров в своих запросах:

@Query("select u from User u where u.firstname = ?#{#customer.firstname}")
List<User> findUsersByCustomersFirstname(@Param("customer") Customer customer);

Дополнительная информация: 1, 2, 3

Возможно ли это даже для запроса Spring JPA IN? Например select u from User u where u.firstName IN (?#{#customer.firstname})?

mrkernelpanic 26.11.2019 13:41

@mrkernelpanic Почему бы и нет? Вы пробовали? .. Я не могу найти такого в проекте Spring Data JPA Примеры, но я уверен, что это должно сработать ..

Cepr0 26.11.2019 15:23

Это работает, но немного иначе. Вам необходимо перейти на select u from User u where u.firstName IN (:#{#customers.![firstName]} ), где customers может быть списком объектов.

mrkernelpanic 27.11.2019 10:59

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