2016-02-23 4 views
5

私はSpringブートとデータレストを使用してJava8で簡単なマイクロサービスを作成し、ポストグレス例外を取得します。春のデータレスト:「日付がnullです」クエリがポストグルの例外をスローする

マイエンティティ:

@Entity 
public class ArchivedInvoice implements Serializable { 
    ... 
    @Column 
    private String invoiceNumber; 
    @Column 
    private java.sql.Date invoiceDate; 
    ... 
} 

マイリポジトリインタフェース:

@RepositoryRestResource(collectionResourceRel = "archivedinvoices", path = "archivedinvoices") 
public interface ArchivedInvoiceRepository extends PagingAndSortingRepository < ArchivedInvoice, Long > { 
    ... 
@RestResource(rel = "findByXYZ", path = "findByXYZ") 
@Query(value = "SELECT ai FROM #{#entityName} ai WHERE " 
     + "(:invoiceNumber IS NULL OR ai.invoiceNumber LIKE :invoiceNumber) AND " 
     + "(:invoiceDate IS NULL OR ai.invoiceDate = :invoiceDate)" 
     ) 
public Page <ArchivedInvoice> findByXYZ(
     @Param("invoiceNumber") @Nullable String invoiceNumber, 
     @Param("invoiceDate") @Nullable Date invoiceDate, 
     Pageable p); 
    ... 
} 

私は」?.../findByXYZ invoiceDate = 2016年2" 月22日と呼んでいる場合、私は以下を取得しますエラーメッセージ:

org.springframework.dao.InvalidDataAccessResourceUsageException: could not extract ResultSet; SQL [n/a]; nested exception is org.hibernate.exception.SQLGrammarException: could not extract ResultSet 
... 
Caused by: org.hibernate.exception.SQLGrammarException: could not extract ResultSet 
... 
Caused by: org.postgresql.util.PSQLException: FEHLER: could not determine data type of parameter 

":invoiceDate IS NULL"部分を削除すると機能します。 invoiceDateパラメータがnullの場合、どうすれば確認できますか?

+0

あなたはhttp://stackoverflow.com/a/27193644/2055854、このいずれかを試みることができる –

答えて

0

PostgresでJPAを使用すると、後で希望の条件をチェックする前にパラメータがヌルかどうかをチェックするときにエラーが発生する不思議な動作があります。

このエラーは、クエリを読み取るときに、JPAがパラメータの種類を識別できず、クエリの解釈中にエラーが発生するために発生します。

この問題を回避するには、パラメータ条件の位置を切り替えて、最初に目的の条件が真であるかどうかを確認し、パラメータがnullかどうかを確認します。

このようにして、JPAは正しいパラメータの種類を特定でき、エラーを再度発生させることはできません。

は、次のクエリを試してみて、それが動作するかどうかを確認:

@Query(value = "SELECT ai FROM #{#entityName} ai WHERE " 
    + "(:invoiceNumber IS NULL OR ai.invoiceNumber LIKE :invoiceNumber) AND " 
    + "(ai.invoiceDate = :invoiceDate OR :invoiceDate IS NULL)" 
    ) 
+1

残念ながら、これはありませんうまくいかない。しかしそれは素晴らしい考えでした!どうも! – user2722077

+0

これは、クエリの最初の日付パラメータでは送信日パラメータではなく、私のために働いていました。クエリには2つの日付パラメータがあります。それは第2のものと同じことを言う。 –

2

私は@BonifacioがIS NULLテストを実行するとき、あなたの@Param("invoiceDate")パラメータの種類を決定することができないというPostgresの中で正しいと信じています。私はあなたのメモリと同様のクエリをメモリH2データベースで期待通りに動作しますが、Postgresの統合テストでは失敗します。

私はそうのような日付にパラメータをキャストすることによってこの問題を回避することができました:

@Query(value = "SELECT ai FROM #{#entityName} ai WHERE " 
    + "(:invoiceNumber IS NULL OR ai.invoiceNumber LIKE :invoiceNumber) AND " 
    + "(cast(:invoiceDate as date) IS NULL OR ai.invoiceDate = :invoiceDate)" 
    ) 
+0

他の人にとっては、UUIDのキャストタイプは「バイナリ」であり、「その他」または「varchar」ではありません。 – user1791139

関連する問題