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