Spring Data JPA @Query结合PostgreSQL时语法错误排查
解决Spring Data JPA @Query中PostgreSQL类型转换符
::被替换的问题 问题原因
你的原生PostgreSQL SQL里使用了::做类型转换,但Spring Data JPA的Hibernate解析器会把::误识别为JPQL参数占位符的起始标记(JPQL用:参数名传递参数),自动将::替换成单个:,导致PostgreSQL抛出语法错误。
解决方案
方法1:改用标准SQL的CAST()函数(推荐)
把PostgreSQL特有的::类型转换换成SQL标准的CAST(表达式 AS 类型)写法,Hibernate不会解析这种语法,能直接传递给PostgreSQL执行。
修改后的查询语句如下:
WITH ranked_data AS ( SELECT json_v, json_v->>'eui64' AS eui64, CAST(json_v->>'ts' AS bigint) AS ts, ROW_NUMBER() OVER (PARTITION BY json_v->>'eui64' ORDER BY CAST(json_v->>'ts' AS bigint) DESC) AS rn FROM ts_kv ) SELECT * FROM ranked_data WHERE rn = 1;
方法2:转义::(不推荐)
如果一定要保留PostgreSQL的::语法,可以把::转义为\\:\\:,让Hibernate不解析它。但这种写法可读性差,且不同Hibernate版本可能存在兼容问题,不建议使用。示例片段:
(json_v->>'ts')\\:\\:bigint
验证
将修改后的SQL放到@Query注解中,并确保加上nativeQuery = true(明确执行原生SQL而非JPQL),即可正常执行并返回预期结果。
内容的提问来源于stack exchange,提问作者ERTY
相关产品推荐
相关产品推荐

