如何在@Query批注中使用参数的方法 [英] How can I use parameter's method in @Query annotation
本文介绍了如何在@Query批注中使用参数的方法的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
是否可以在@Query
注释内调用参数的方法?
Is it possible to invoke parameter's method inside @Query
annotation?
示例:
@Query("SELECT user " +
"FROM User user " +
"WHERE (?1.getFilter() = '*' OR user.name = ?1)");
List<User> getUsers(UserNameFilter userNameFilter);
我知道我可以做这样的事情:
I know that I can do something like this:
@Query("SELECT user " +
"FROM User user " +
"WHERE (?1 = '*' OR user.name = ?1)");
List<User> getUsers(String userName);
但是,当过滤器数量增加时,这意味着我需要更改许多参数.
But when a number of filters are increasing it means that I need to change a number of parameters.
推荐答案
例如,借助SpEL,您可以在查询中使用Spring bean方法
With SpEL you can use Spring bean methods in your queries, for example
@Query("select e from MyEntity e where ?#{@myBean.myMethod(#param1)} is true")
List<MyEntity> entities = getEntity(@Param("param1") String param);
您可以用任何适当的方式定义bean,例如:
You can define your bean in any proper way, for example:
@Component
public class MyBean {
public boolean myMethod(String param) {...}
}
或者甚至可以是相同的仓库:
Or it can be even the same repo:
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) {...}
}
您还可以在查询中使用参数属性:
Also you can use parameter properties in your queries:
@Query("select u from User u where u.firstname = ?#{#customer.firstname}")
List<User> findUsersByCustomersFirstname(@Param("customer") Customer customer);