JPA原生查询参数未替换问题(PostgreSQL text[]列场景)
解决PostgreSQL text[]列的JPA原生查询参数不替换问题
问题根源很明确:你把参数tenantId放在了单引号里,JPA的参数替换机制无法识别被单引号包裹的:tenantId,会把它当成普通字符串字面量直接传给数据库,自然不会替换成实际参数值。
给你几种可行的修正写法:
方案一:配合@Param注解直接使用参数
去掉参数周围的单引号,直接在ARRAY构造器里用:tenantId,同时用@Param绑定参数名:
public interface MyUserRepo extends CrudRepository<MyUser, String> { @Query(value = "SELECT * FROM my_user x WHERE x.tenant_ids @> ARRAY[:tenantId] AND x.roles @> ARRAY['driver']", nativeQuery = true) Set<MyUser> findDrivers(@Param("tenantId") String tenantId); }
方案二:使用索引参数
如果不想用@Param,直接用索引参数?1,同样不要加单引号:
public interface MyUserRepo extends CrudRepository<MyUser, String> { @Query(value = "SELECT * FROM my_user x WHERE x.tenant_ids @> ARRAY[?1] AND x.roles @> ARRAY['driver']", nativeQuery = true) Set<MyUser> findDrivers(String tenantId); }
方案三:显式转换参数类型(可选)
如果遇到JPA无法自动识别参数类型的情况,可以显式把参数转为text类型:
public interface MyUserRepo extends CrudRepository<MyUser, String> { @Query(value = "SELECT * FROM my_user x WHERE x.tenant_ids @> ARRAY[?1::text] AND x.roles @> ARRAY['driver']", nativeQuery = true) Set<MyUser> findDrivers(String tenantId); }
核心逻辑总结:不要给JPA的参数占位符加单引号,单引号会让占位符失去作用,被当成普通字符串处理。
内容的提问来源于stack exchange,提问作者JPG
相关产品推荐
相关产品推荐

