2017-03-08 7 views
0

ときジェクトJSONパラメータ - 春JPA

@Query(value = "SELECT * FROM person WHERE school = :schoolId AND details @> '{\"id\":\"1234\",\"name\":\"John\"}'", nativeQuery = true)

この作品私は@Param( "schoolIdに")文字列schoolId

を渡しています。しかし、私はのparamとして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

+0

実際の例外を表示してください。原因は、原因チェーンの最後にある 'SQLGrammarException'を引き起こします。私たちはそれなしでしか推測できません。 - しかし、私の最善の策は、spring + jdbcが '@Param(" details ")String details'パラメータを' VARCHAR'としてバインドすることです。 'uuid'や' json [b] 'のようないくつかの非在来型を使いたいのであれば、通常はJDBCで作業するのは難しいです。接続文字列に 'stringtype = unspecified' [JDBC DSNパラメタ](https://jdbc.postgresql.org/documentation/head/connect.html#connection-parameters)を追加するだけで、頭痛を避けることができます。 – pozs

+0

...または 'details @> CAST(:details AS json [b])'のような明示的なキャストを使うことができますが、それはむしろ不快なIMHOです。 – pozs

+0

@pozsあなたは正しいです、それはCAST(:details AS jsonb)として型キャストした後に機能しました。あなたが答えと同じものを投稿することができれば、それを受け入れて質問を終わらせます。 –

答えて

1

デフォルトでは、Spring + JDBCは文字列をVARCHARとしてバインドします。あなたには、いくつかの非標準的なタイプは、あなたが、あなたが彼らのString表現をバインドしたい&パラメータとして使用されるクエリの多くを、持っている場合、

details @> CAST(:details AS jsonb) 

しかし:ここで安価な解決策は、キャスト(複数可)を使用することです

stringtype=unspecified 

を接続文字列に使用できます。そうすれば、setString()に束縛されているすべてのパラメータはPostgreSQLにunknownの型を持つことになるので、実際の型を推測しようとします。