当前位置: 首页 > 知识库问答 >
问题:

的用法?在jsonb上的本机SQL查询中

鲁阳焱
2023-03-14

我需要针对Postgresjsonb列激发一个select查询:

entityManager.createNativeQuery(
 "select * from table where jsonbcol -> 'usernames' ? :un"
).setParameter("un", userName).getResultList()

运行时会引发异常:

org.hibernate.engine.query.ParameterRecognitionException: Mixed parameter strategies - 
use just one of named, positional or JPA-ordinal strategy

我尝试过像\\???这样的转义,但没有帮助。

如何正确地打那个电话?

共有2个答案

燕飞文
2023-03-14

正如文件所说:

在JDBC中,问号()是PreparedStatement的位置参数的占位符。但是,有许多PostgreSQL运算符包含问号。若要防止SQL语句中的此类问号被解释为位置参数,请使用两个问号(??)作为转义序列。

秦经义
2023-03-14

有一个替代的解决方案可以证明是一个优雅的变通方法。Postgres运算符基于jsonb_exists()函数,因此

where jsonbcol -> 'usernames' \\?\\? :un

您可以使用

where jsonb_exists(jsonbcol -> 'usernames', :un)
 类似资料:
  • 我试图使用本机查询将多个表中的联接值检索到自定义POJO中。我要检索的值之一是JSONB字段。虽然我能够获得具有该字段的实体,但当我将其强制输入自定义POJO时,我得到了一个org.hibernate.MappingExcema: No Dialect映射for JDBC type: 1111异常。下面是我使用的: 使用POJO的: 使用MyJson类: 而且 还有我的定制POJO “@TypeD

  • 问题内容: 我们正在尝试为本地sql查询动态生成IN子句以返回JPA实体。Hibernate是我们的JPA提供程序。我们的代码看起来像这样。 这是行不通的,in子句无法识别通过这种方式传入的任何值。有谁知道解决这个问题的方法吗? 问题答案: 在您的情况下,JPA支持命名列表参数:

  • 我使用注释和注释执行查询,并从数据库表中删除记录。 错误: xxx的例外。xxx。xx,原因='javax。坚持不懈TransactionRequiredException:执行更新/删除查询“和异常=”执行更新/删除查询;嵌套的异常是javax。坚持不懈TransactionRequiredException:执行更新/删除查询'

  • 我研究了应该是某种命名参数或主机变量(DB2),但没有找到类似的示例来说明我正在尝试的操作。我只使用过来使用来设置一个参数,据我所知,这个参数是针对JPQL的。因为我在这里尝试的是本机SQL查询,所以不确定这是否可以工作。 [错误]~2019-09-19-07.26.30.347 CDT~~~~O.A.C.C.C.[.[.[.[.[dispatcherServlet]servlet.Service

  • 问题内容: 我有一个本机SQL查询,如下所示: 问题是,Hibernate的解释,,作为参数,并希望我们给值,, 但是我不想让Hibernate这样解释,所以我想逃避冒号。 怎么做 ? 问题答案: 在Hibernate中,转义以开头。但是在Java中,您还必须逃脱另一个。因此,所有内容都需要替换为。最后,您得到:

  • 给定以下JSON,它作为jsonb存储在postgres表中: 我有一个工作查询来搜索JSON文档中是否存在值: 但是,当我试图在JPARepository上使用本机查询在Spring-Data-JPA中复制这个查询时,我总是得到以下异常: 还是什么都不起作用。JPA实体如下所示: 涉及该实体的其他查询可以很好地使用绑定到MyJson实体的jsonb字段。有没有办法让这起作用?