Spring JPA Native Query无结果返回,参数未注入问题
解决Spring Boot JPA原生查询参数未正确绑定无结果的问题
看起来你遇到的问题是原生SQL查询中的参数没有被正确注入,导致查询返回空结果。我来帮你一步步排查和解决:
1. 改用命名参数绑定(推荐)
位置参数(?1、?2)有时候会因为解析顺序或语法细节导致绑定异常,换成命名参数会更清晰且不易出错:
修改你的Repository方法和查询语句:
@Query(nativeQuery = true, value = "SELECT *, (6371 * acos(cos(radians(:latitude)) * cos(radians(latitude)) * cos(radians(longitude) - radians(:longitude)) + sin(radians(:latitude)) * sin(radians(latitude)))) as distance " + "FROM merchant_outlet_services " + "WHERE service_id = :serviceId " + "HAVING distance < 3 " + "ORDER BY distance LIMIT 5;") List<Respone> findNearByPlacesByService(@Param("serviceId") Integer service, @Param("latitude") float lat, @Param("longitude") float longg);
2. 优化HAVING子句的使用逻辑
虽然MySQL允许无GROUP BY时使用HAVING,但部分场景下可能存在解析兼容性问题。可以用子查询的方式规避这个问题:
@Query(nativeQuery = true, value = "SELECT * FROM (" + "SELECT *, (6371 * acos(cos(radians(:latitude)) * cos(radians(latitude)) * cos(radians(longitude) - radians(:longitude)) + sin(radians(:latitude)) * sin(radians(latitude)))) as distance " + "FROM merchant_outlet_services " + "WHERE service_id = :serviceId) AS temp " + "WHERE temp.distance < 3 " + "ORDER BY temp.distance LIMIT 5;") List<Respone> findNearByPlacesByService(@Param("serviceId") Integer service, @Param("latitude") float lat, @Param("longitude") float longg);
通过子查询先计算出distance,再在外层用WHERE过滤,兼容性和可读性都会更好。
3. 确认参数与数据库字段类型匹配
检查数据库中latitude和longitude的字段类型,如果是DOUBLE类型,建议把方法参数改成double而非float,避免精度损失导致计算结果偏差:
List<Respone> findNearByPlacesByService(@Param("serviceId") Integer service, @Param("latitude") double lat, @Param("longitude") double longg);
4. 查看实际绑定的参数值
开启Hibernate的参数绑定日志,确认参数是否正确传入:
在application.properties中添加:
logging.level.org.hibernate.type.descriptor.sql=TRACE
此时日志会显示SQL执行时实际绑定的参数值,你可以验证是否和传入的参数一致。
5. 直接在数据库中测试SQL逻辑
把日志里的SQL语句拿出来,手动替换参数值在数据库客户端执行。如果手动执行有结果,说明是代码层面的参数绑定问题;如果手动也无结果,那可能是数据本身的问题或者SQL逻辑需要调整。
内容的提问来源于stack exchange,提问作者Ankit S
相关产品推荐
相关产品推荐

