You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Hibernate 6.1.7使用createNativeQuery时JSON转换语法异常问题

Hibernate 6.1.7中NativeQuery使用JSON类型转换语法的问题解决

问题原因

Hibernate默认会将原生SQL中的冒号(:)识别为参数占位符,当你在SQL中使用PostgreSQL的JSON类型转换语法flag::jsonb时,第二个冒号会被Hibernate的SQL解析器误处理,最终被移除,导致SQL变成flag:jsonb,触发语法错误。

解决方案

方法1:用CAST函数替代::语法

直接使用标准SQL的CAST函数替换PostgreSQL的简写语法,完全避开冒号冲突:

Query<Object[]> query = new SessionManager().fetch()
    .createNativeQuery(
        "select contactid, CAST(flag AS jsonb)->>'priority' as priority from contact", 
         Object[].class);

方法2:转义冒号

通过转义让Hibernate保留双冒号的写法,注意Java字符串中需要对反斜杠做双重转义:

Query<Object[]> query = new SessionManager().fetch()
    .createNativeQuery(
        "select contactid, flag\\::jsonb->>'priority' as priority from contact", 
         Object[].class);
// 部分版本需显式设置转义字符
query.setEscapeCharacter('\\');

方法3:使用NamedNativeQuery注解

在实体类上定义命名原生查询时,注解内的SQL不会被当作动态参数解析,可直接使用::语法:

@NamedNativeQuery(
    name = "Contact.getPriority",
    query = "select contactid, flag::jsonb->>'priority' as priority from contact",
    resultClass = Object[].class
)
@Entity
public class Contact {
    // 实体字段定义
}

调用时通过查询名称获取实例:

Query<Object[]> query = new SessionManager().fetch()
    .createNamedQuery("Contact.getPriority", Object[].class);

内容的提问来源于stack exchange,提问作者Z. Suja

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 11:45:15