2016-04-25 9 views
2

MySQLからに切り替わった後PostgreSQL私のSQLクエリ(@Queryが春のデータリポジトリインタフェースで動作する)がもう機能しないことがわかりました。問題は、はbyteaとして送信されてヌル値によって引き起こされ、私は次の例外取得しています:@queryとSpringデータリポジトリがnullをPostgreSQLデータベースに送信する

Caused by: org.postgresql.util.PSQLException: ERROR: operator does not exist: bigint = bytea 
Hint: No operator matches the given name and argument type(s). You might need to add explicit type casts. 

リポジトリ:

public interface WineRepository extends PagingAndSortingRepository<Wine, Long> { 
    @Query(value = "SELECT * FROM WINE w WHERE (?1 IS NULL OR w.id = ?1)", nativeQuery = true) 
    Wine simpleTest(Long id); 
} 

簡単なテスト:

LOGGER.warn("test1: {}", wineRepository.simpleTest(1L)); //ok 
LOGGER.warn("test2: {}", wineRepository.simpleTest(null)); //PSQLException 

実際のケースでは、私はnullになることができる複数のパラメータがあり、私はそれらをjavaコードでチェックしたくないSQLクエリにそれらを送信します。私はここでstackoverflowの質問をチェックしたが、特にバネデータリポジトリの@queryアノテーションには良い答えが見つからなかった。

PostgreSQLでnull値を処理する正しい方法は何ですか?それとも私のアプローチを修正するためのヒントがありますか?ありがとう!

更新: 問題がnativeQuery = trueに関連すると思わ値がfalseの場合に予想されるように、null値が働きます。つまり、nativeQueryを有効にしても機能させることが可能かどうかということです。

答えて

0

Java nullがPostgres NULLと等しいかどうかを確認しようとしていますが、これは必要ないと思います。以下のように書き直して、simpleTest関数にnullを送信しないようにすることができます。

@Query(value = "SELECT * FROM WINE w WHERE (w.id IS NULL OR w.id = ?1)", nativeQuery = true) 
Wine simpleTest(Long id); 
+1

しかし、私の意図はJavaからの入力がnullかどうかをチェックすることです。私はnullのデータベースから値を選択しようとしていません。 – rhorvath

0

私は@Queryの中で、LongがPostgresによってbyteaとして解釈されていたのと同様の問題がありました。私の解決策は@Paramをunboxすることでした...長い値を渡すことによってPostgresはbigintとして値を正しく解釈しました

関連する問題