Hibernate CreateNativeQuery 是否允许 JSON 转换?

问题描述 投票:0回答:2

使用 JavaHibernate 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

org.hibernate.exception.SQLGrammarException
to JPA
PersistenceException
: JDBC 异常执行 SQL [选择 联系方式, flag:jsonb->>'priority' 作为优先级 从 接触] 在 org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:165) ...

为什么要去掉另一个冒号?

java postgresql hibernate jpql nativequery
2个回答
0
投票

不要在您的原生查询中使用

::
转换运算符。试试
CAST( smth AS target-type)
代替:

select contactid, CAST(flag AS jsonb) ->> 'priority' as priority from contact

使用

::
转换运算符会导致错误,因为
:name
用于表示查询中的命名参数。


0
投票

我会报告这个。确实,正如 Mark 所说,

:name
应该在 JPA 中的本机 SQL 查询中进行解析。

但我会说我们应该 easily 能够识别

::
并且不管它。

所以我会称之为错误。

更新

所以,事实证明这是某人 有意 实现的(未记录的)功能。这个想法是你可以使用双冒号作为转义来写一个冒号。

我必须说一点都不喜欢它,我怀疑它是否符合规范。我想回滚它,但另一方面它已经存在了很长一段时间。

Sooooo,也就是说,你可以这样写你的查询:

select contactid, flag::::jsonb->>'priority' as priority from contact

带有四个冒号。

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.