Java 在nativeQuery中注入JSON参数

Java 在nativeQuery中注入JSON参数,java,spring,postgresql,spring-data-jpa,jsonb,Java,Spring,Postgresql,Spring Data Jpa,Jsonb,当 @Query( value = "SELECT * FROM person WHERE school = :schoolId AND details @> '{\"id\":\"1234\",\"name\":\"John\"}'", nativeQuery = true ) 我正在传递@Param(“schoolId”)字符串schoolId 但是,当我将JSON作为参数传递时,它会失败 org.springframework.dao.InvalidDataAccessR

@Query(
  value = "SELECT * FROM person WHERE school = :schoolId AND details @> '{\"id\":\"1234\",\"name\":\"John\"}'", 
  nativeQuery = true
)
我正在传递
@Param(“schoolId”)字符串schoolId

但是,当我将JSON作为参数传递时,它会失败

org.springframework.dao.InvalidDataAccessResourceUsageException, could not extract ResultSet; SQL [n/a]; nested exception is 
org.hibernate.exception.SQLGrammarException: could not extract ResultSet

org.postgresql.util.PSQLException: ERROR: operator does not exist: jsonb @> character varying
Hint: No operator matches the given name and argument type(s). You might need to add explicit type casts.

@Query(value = "SELECT * FROM person WHERE school = :schoolId AND details @> :details", nativeQuery = true)

@Param("schoolId") String schoolId, @Param("details") String details

默认情况下,Spring+JDBC将字符串绑定为
VARCHAR
。这里的廉价解决方案是使用cast:

但是,如果您有很多查询,其中一些非标准类型被用作参数&您希望绑定它们的字符串表示形式,那么可以使用

stringtype=unspecified

在您的连接字符串中。这样,由
setString()
绑定的每个参数在PostgreSQL中都将有一个
未知的
类型,因此它将尝试推断它们的实际类型。

Spring+JDBC默认情况下将字符串绑定为
VARCHAR
。这里的廉价解决方案是使用cast:

但是,如果您有很多查询,其中一些非标准类型被用作参数&您希望绑定它们的字符串表示形式,那么可以使用

stringtype=unspecified
在您的连接字符串中。这样,由
setString()
绑定的每个参数在PostgreSQL中将有一个
未知的
类型,因此它将尝试推断它们的实际类型。

谢谢

除了解决方案之外,您还可以执行以下角色转换:

details@>:细节::jsonb

我正在使用postgres的第11版,不确定它是什么时候推出的。

谢谢

除了解决方案之外,您还可以执行以下角色转换:

details@>:细节::jsonb


我正在使用postgres的第11版,不确定它是什么时候推出的。

请向我们展示真正的异常,它是
原因
d
SQLGrammarException
(位于原因链的末尾)。没有它,我们只能猜测但我的最佳选择是spring+jdbc将
@Param(“details”)字符串details
参数绑定为
VARCHAR
。如果您想使用一些非常规类型,例如
uuid
json[b]
,那么使用JDBC通常很困难。只需将
stringtype=unspecified
添加到连接字符串中,就可以避免很多麻烦。。。。或者您可以只使用显式强制转换,如
details@>cast(:details AS json[b])
,但这是相当令人不愉快的,IMHO@pozs您是对的,它在将其作为强制转换(:details AS jsonb)键入后确实起作用。如果您可以发布与答案相同的内容,我将接受它并结束问题。请向我们展示真正的异常,即
原因
d
SQLGrammarException
(位于原因链的末尾)。没有它,我们只能猜测但我的最佳选择是spring+jdbc将
@Param(“details”)字符串details
参数绑定为
VARCHAR
。如果您想使用一些非常规类型,例如
uuid
json[b]
,那么使用JDBC通常很困难。只需将
stringtype=unspecified
添加到连接字符串中,就可以避免很多麻烦。。。。或者您可以只使用显式强制转换,如
details@>cast(:details AS json[b])
,但这是相当令人不愉快的,IMHO@pozs您是对的,它在将其作为强制转换(:details AS jsonb)键入后确实起作用。如果你能发布与答案相同的内容,我将接受并结束问题。