Можно ли вызвать метод параметра внутри аннотации @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);
Но когда количество фильтров увеличивается, это означает, что мне нужно изменить ряд параметров.




С помощью 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 Почему бы и нет? Вы пробовали? .. Я не могу найти такого в проекте Spring Data JPA Примеры, но я уверен, что это должно сработать ..
Это работает, но немного иначе. Вам необходимо перейти на select u from User u where u.firstName IN (:#{#customers.![firstName]} ), где customers может быть списком объектов.
Я не думаю, что это возможно. Вы можете использовать Criteria Api и передать объект Filter.