【问题标题】:How can I use parameter's method in @Query annotation如何在@Query 注释中使用参数的方法
【发布时间】:2018-10-31 00:58:19
【问题描述】:

是否可以在@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);

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

【问题讨论】:

标签: java spring hibernate spring-data spring-data-jpa


【解决方案1】:

例如,通过 SpEL,您可以在查询中使用 Spring bean 方法

@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);

其他信息:123

【讨论】:

  • Spring JPA 查询 IN 是否有可能?例如select u from User u where u.firstName IN (?#{#customer.firstname}) ?
  • @mrkernelpanic 为什么不呢?你试过了吗?..我在 Spring Data JPA 项目examples 中找不到这样的,但我相信这应该可以工作..
  • 它可以工作,但略有不同。您必须更改为select u from User u where u.firstName IN (:#{#customers.![firstName]} ),其中customers 可以是对象列表。
猜你喜欢
  • 1970-01-01
  • 2018-01-31
  • 2021-03-26
  • 2019-05-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-14
相关资源
最近更新 更多