我正在使用 Spring Data Rest,我的存储库扩展了 JpaRepository,我想使用 @Query 创建自定义查询。我的方法参数是请求参数,我想将其用作查询的参数。
@Query("SELECT u FROM User u WHERE u.name = :search")
List<User> findBySearch(@RequestParam("search") @Param("search")
String search);
我可以使用RequestParam作为查询参数吗?
参数是在功能块中定义的变量。因此,每当我们需要将值传递给特定功能块时,基本上都会使用它。
取决于这个;即使你可以使用
@RequestParam
,当你调用这个方法时,你也必须发送这个值。
我不确定使用它获取值是否是您想要的。
Spring 支持使用受限 SpEL 模板表达式 在使用
. 定义的手动定义的查询中@Query
您可以创建自定义
EvaluationContextExtension
以直接在@Query中使用请求参数。
@Component
public class RequestEvaluationContextExtension
implements EvaluationContextExtension {
private final HttpServletRequest httpServletRequest;
public RequestEvaluationContextExtension(
HttpServletRequest httpServletRequest) {
this.httpServletRequest = httpServletRequest;
}
@Override
public Map<String, Object> getProperties() {
Map<String, Object> properties = new HashMap<>(
EvaluationContextExtension.super.getProperties());
return properties;
}
@Override
public String getExtensionId() {
return "request";
}
@Override
public Object getRootObject() {
return httpServletRequest;
}
}
查询中的用法应该是这样的:
@Query("SELECT u FROM User u WHERE u.name = ?#{request.getParameter('search')}")
List<User> findBySearchParameter();
您可以调用此存储库方法而不发送任何参数。
如果您的http请求有
search
参数(例如:http://localhost:8080/test?search=foobar
)您可以根据此参数的值创建查询。