You need to enable JavaScript to run this app. Hibernate错误解析jsonb字段查询:双冒号::被误转为单冒号报错
优惠活动
大模型
产品
解决方案
定价
更多

Hibernate错误解析jsonb字段查询:双冒号::被误转为单冒号报错

异常产生的根本原因

问题本质是Hibernate的SQL解析规则与PostgreSQL原生语法的定义冲突:

  • Hibernate在解析传入的SQL语句时,会将单个冒号:固定识别为命名参数的起始标记:只要扫描到单冒号,就会立即进入参数匹配逻辑,向后连续读取标识符字符作为参数名,直到遇到非合法的参数字符才终止解析
  • SQL中使用的PostgreSQL双冒号类型转换语法::,本身就是两个连续的冒号结构。Hibernate解析器不会针对PostgreSQL的专属语法做特殊适配,遇到第一个冒号时就直接触发了参数解析逻辑,根本不会识别后续的第二个冒号属于类型转换语法的组成部分,硬生生把完整的类型转换表达式拆碎了。

具体到场景的错位过程

原合法SQL片段:(attrs->>'data')::jsonb::text
解析器扫描到双冒号结构的第一个:时,直接把前面的(attrs->>'data')判定为独立片段,为了补全语法结构自动加上了单引号包裹,后续剩下的jsonb、text 就被当成了错配的语法块,最终生成日志中看到的错误片段'(attrs->>'data')':jsonb:text,直接触发SQL执行报错。

补充说明

这类冲突在Hibernate操作PostgreSQL的场景中非常普遍:除了双冒号类型转换,PostgreSQL的数组字面量、JSON操作符中涉及冒号的写法都可能触发同类解析错位。常规规避方式是书写原生SQL时,用标准的CAST(原值 AS 目标类型)语法替代::类型转换,即可完全绕开解析规则冲突。


内容的提问来源于stack exchange,提问作者Hari

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.27 01:27:03