如何在@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()); } }
必须修正的拼写错误
- Controller中的
@GetterMapping是错误注解,正确为@GetMapping @ReqeustBody拼写错误,正确注解是@RequestBody
额外注意
GET请求携带RequestBody并不符合HTTP规范,虽然Postman等客户端支持,但更推荐用请求参数(如/body?color=red)或路径变量实现,兼容性更强。
内容的提问来源于stack exchange,提问作者Wabi-Sabi
相关产品推荐
相关产品推荐

