使用 Spring Data Rest 时可以使用 RequestParam 作为 Query 注解参数吗?

问题描述 投票:0回答:1

我正在使用 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作为查询参数吗?

spring spring-boot spring-data-jpa spring-data-rest
1个回答
0
投票

参数是在功能块中定义的变量。因此,每当我们需要将值传递给特定功能块时,基本上都会使用它。

取决于这个;即使你可以使用

@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
您可以根据此参数的值创建查询。

© www.soinside.com 2019 - 2024. All rights reserved.