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
相关产品推荐
相关产品推荐

