Tôi đã dành thời gian xem xét vấn đề này vì tôi thực sự muốn so sánh "ngày là null" trong các truy vấn và đó là kết quả:
Khi bạn sử dụng " cast (foo.date as date) là null ", nó hoạt động OK nếu trường không null. Nếu trường là null, ngoại lệ này được ném ra:
org.postgresql.util.PSQLException: ERROR: cannot cast type bytea to date
Giải pháp là sử dụng kết hợp:
coalesce(:date, null) is null
Nó hoạt động tốt khi có hoặc không có dữ liệu trong trường được kiểm tra.
Ví dụ về truy vấn của tôi:
@Query("SELECT c "
+ " FROM Entity c "
+ " WHERE "
+ " and ( (coalesce(:dateFrom, null) is null and coalesce(:dateUntil, null) is null) "
+ " or ((coalesce(c.date, null) is not null) "
+ " and ( "
+ " ((coalesce(:dateFrom, null) is null and coalesce(:dateUntil, null) is not null) and c.date <= :dateUntil) "
+ " or ((coalesce(:dateUntil, null) is null and coalesce(:dateFrom, null) is not null) and c.date >= :dateFrom)"
+ " or (c.date between :dateFrom and :dateUntil)"
+ " )"
+ " )"
+ " ) "
Hy vọng nó hiệu quả với bạn!