使用 Java 和 Hibernate 6.1.7 Final:
使用
createNativeQuery()
时是否可以在select语句中使用JSON键?
例子:
Query<Object[]> query = new SessionManager().fetch()
.createNativeQuery(
"select contactid, flag::jsonb->>'priority' as priority from contact",
Object[].class);
单步执行程序,可以看到
query.sqlString
是:
select contactid, flag:jsonb->>'priority' as priority from contact
尽管
query.originalSqlString
是:
select contactid, flag::jsonb->>'priority' as priority from contact
例外:
16-May-2023 11:18:34.801 错误 [http-nio-65501-exec-8] org.hibernate.engine.jdbc.spi.SqlExceptionHelper.logExceptions 错误:“:”处或附近的语法错误 位置:31 jakarta.persistence.PersistenceException: Converting
to JPAorg.hibernate.exception.SQLGrammarException
: JDBC 异常执行 SQL [选择 联系方式, flag:jsonb->>'priority' 作为优先级 从 接触] 在 org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:165) ...PersistenceException
为什么要去掉另一个冒号?
不要在您的原生查询中使用
::
转换运算符。试试 CAST( smth AS target-type)
代替:
select contactid, CAST(flag AS jsonb) ->> 'priority' as priority from contact
使用
::
转换运算符会导致错误,因为 :name
用于表示查询中的命名参数。
我会报告这个。确实,正如 Mark 所说,
:name
但我会说我们应该 easily 能够识别
::
并且不管它。
所以我会称之为错误。
所以,事实证明这是某人 有意 实现的(未记录的)功能。这个想法是你可以使用双冒号作为转义来写一个冒号。
我必须说一点都不喜欢它,我怀疑它是否符合规范。我想回滚它,但另一方面它已经存在了很长一段时间。
Sooooo,也就是说,你可以这样写你的查询:
select contactid, flag::::jsonb->>'priority' as priority from contact
带有四个冒号。