JPA自定义原生查询中:s_polygoneDepartement参数未替换问题求助
问题根因
参数未被替换的核心原因是你将:s_polygoneDepartement占位符放在了单引号'的包裹范围内。JPA 原生查询执行参数绑定的时候,会将单引号内的所有内容识别为固定字符串常量,不会解析其中的参数占位符,因此最终生成的 SQL 会直接把引号内的内容当成固定值处理,和参数是否出现在=附近没有任何关系。
修复方案
ST_GeomFromGeoJSON 函数本身接收字符串类型的入参,你只需要把占位符直接作为函数的入参传入即可,不需要额外加单引号包裹,修正后的代码如下:
@Query(value = " select * from poi where ST_Intersects(geog , " + " ST_GeomFromGeoJSON(:s_polygoneDepartement)" + " ) = 'true' ", countQuery = " select count(*) from poi where ST_Intersects(geog , " + " ST_GeomFromGeoJSON(:s_polygoneDepartement)" + " ) = 'true' ", nativeQuery = true) Page<Poi> findAllByNomDepartementFr(@Param("s_polygoneDepartement") String s_polygoneDepartement, Pageable pageable);
扩展说明
所有 JPA 原生查询的参数占位符都不能放在单引号内,如果你遇到需要拼接字符串的场景(比如模糊查询),可以使用数据库的CONCAT函数实现,错误写法like '%:keyword%',正确写法like CONCAT('%', :keyword, '%'),原理和本次问题完全一致。
内容的提问来源于stack exchange,提问作者Camel4488
相关产品推荐
相关产品推荐

