You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在@Query注解中结合@RequestBody实现数据库查询?

问题解决:@Query结合@RequestBody的正确用法

你遇到的错误是因为Spring Data JPA的@Query不支持:body.getColor()这种直接调用getter的语法,同时代码里还有几处拼写错误,下面是正确的实现方式:

方案一:使用SpEL表达式绑定实体属性

通过SpEL表达式:#{#参数名.属性名}引用传入实体的属性,同时给方法参数加上@Param注解指定参数名,让SpEL能正确识别:

import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;

@Repository
public interface PlanetRepository extends JpaRepository<Planet, Long> {
    @Query(value = "SELECT * FROM planets WHERE color = :#{#body.color}", nativeQuery = true)
    Iterable<Planet> getBody(@Param("body") Planet body);
}

方案二:拆分参数(更简洁)

如果只需要用到实体中的单个属性,直接把该属性作为方法参数,绑定到SQL的命名参数里,代码更直观:

import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;

@Repository
public interface PlanetRepository extends JpaRepository<Planet, Long> {
    @Query(value = "SELECT * FROM planets WHERE color = :color", nativeQuery = true)
    Iterable<Planet> getBody(@Param("color") String color);
}

对应的Controller调整为:

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class PlanetController {
    private final PlanetRepository planetRepository;

    public PlanetController(PlanetRepository planetRepository) {
        this.planetRepository = planetRepository;
    }

    @GetMapping("/body")
    Iterable<Planet> getBody(@RequestBody Planet body) { 
        return planetRepository.getBody(body.getColor()); 
    }
}

必须修正的拼写错误

  1. Controller中的@GetterMapping是错误注解,正确为@GetMapping
  2. @ReqeustBody拼写错误,正确注解是@RequestBody

额外注意

GET请求携带RequestBody并不符合HTTP规范,虽然Postman等客户端支持,但更推荐用请求参数(如/body?color=red)或路径变量实现,兼容性更强。

内容的提问来源于stack exchange,提问作者Wabi-Sabi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 23:00:55