代码之家  ›  专栏  ›  技术社区  ›  ByeBye

如何在@query annotation中使用参数的方法

  •  1
  • ByeBye  · 技术社区  · 8 年前

    是否可以在内部调用参数的方法 @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);
    

    但是当一些过滤器增加时,这意味着我需要改变一些参数。

    1 回复  |  直到 7 年前
        1
  •  4
  •   Cepr0    8 年前

    例如,使用spel,您可以在查询中使用SpringBean方法。

    @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