Spring Boot原生查询中MySQL参数未绑定问题求助
Spring Boot原生查询中MySQL参数未绑定问题求助
嘿,我瞅你这段Spring Boot的原生查询代码大概率是遇到参数绑定失效的问题了吧?我之前也踩过类似的坑,给你分析下问题出在哪,再给你几个可行的解决办法~
首先看你写的这段查询代码:
@Query(value = """ SELECT a.*, ST_Distance_Sphere(a.coordinate, ST_GeomFromText('POINT(:lat :lng)', 4326)) AS distance FROM airport a ORDER BY distance ASC LIMIT 1 """, nativeQuery = true) Airport findNearestAiportToPosition(Double latitude, Double longitude);
问题的核心就在这儿:你把:lat和:lng这两个参数放在了单引号包裹的字符串'POINT(:lat :lng)'里面,Spring Data JPA的原生查询参数绑定机制是没办法识别字符串内部的占位符的,它只会把整个'POINT(:lat :lng)'当成一个普通的字符串字面量,根本不会去替换里面的参数,自然就导致参数没正确绑定啦。
给你两个靠谱的解决思路:
方法一:用CONCAT函数拼接POINT字符串,把参数从单引号里解放出来
这种方式是把纬度和经度参数作为独立的绑定项,通过CONCAT函数拼成POINT需要的字符串格式,这样JPA就能正确识别并绑定参数了。记得加上@Param注解明确参数名称,避免因为编译时参数名丢失导致的绑定失败:import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; // ... @Query(value = """ SELECT a.*, ST_Distance_Sphere(a.coordinate, ST_GeomFromText(CONCAT('POINT(', :lat, ' ', :lng, ')'), 4326)) AS distance FROM airport a ORDER BY distance ASC LIMIT 1 """, nativeQuery = true) Airport findNearestAirportToPosition(@Param("lat") Double latitude, @Param("lng") Double longitude);方法二:用MySQL的ST_MakePoint函数直接生成点(更推荐)
MySQL自带的ST_MakePoint函数可以直接接收数值类型的经度和纬度参数,不需要拼接字符串,既安全又能彻底避开参数绑定的问题。这里要注意ST_MakePoint的参数顺序是经度在前,纬度在后,和POINT字符串的格式是一致的:@Query(value = """ SELECT a.*, ST_Distance_Sphere(a.coordinate, ST_MakePoint(:lng, :lat)) AS distance FROM airport a ORDER BY distance ASC LIMIT 1 """, nativeQuery = true) Airport findNearestAirportToPosition(@Param("lat") Double latitude, @Param("lng") Double longitude);
另外再提个小细节:你的方法名里把Airport拼成了Aiport,虽然不影响功能,但还是改过来更规范哦~
内容来源于stack exchange
相关产品推荐
相关产品推荐

