Nếu entity.getHistory() là đoạn rỗng mã sau:PostgreSQL JDBC Null Chuỗi thực hiện như là một bytea
(getEntityManager() trả về mùa xuân tiêm EntityManager, cơ sở dữ liệu loại lịch sử lĩnh vực là: văn bản hoặc varchar2 (2000)
Query query = getEntityManager().createNativeQuery("insert into table_name(..., history, ....) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)")
[...]
.setParameter(6, entity.getHistory())
[...]
query.executeUpdate();
Cung cấp ngoại lệ lạ:
17/11/11 06:26:09:009 [pool-2-thread-1] WARN util.JDBCExceptionReporter:100 - SQL Error: 0, SQLState: 42804
17/11/11 06:26:09:009 [pool-2-thread-1] ERROR util.JDBCExceptionReporter:101 - ERROR: **column "history" is of type text but expression is of type bytea**
Gợi ý: Bạn sẽ cần phải viết lại hoặc đúc biểu thức
01.235.Vấn đề chỉ xảy ra trong cấu hình này:
Hệ điều hành: CentOS phát hành 5.6 (Final)
Java: 1.6.0_26
DB: PostgreSQL 8.1
JDBC driver: postgresql-9.1-901.jdbc4
Application Server: apache -tomcat-6.0.28
Mọi thứ hoạt động tốt trên vài cấu hình khác hoặc khi lịch sử là chuỗi rỗng. Tuyên bố tương tự được thực hiện từ pgAdmin hoạt động tốt.
Tôi đoán vấn đề nằm trong trình điều khiển JDBC PostgreSQL, có một số lý do hợp lý để xử lý chuỗi rỗng dưới dạng giá trị bytea không? Có lẽ một số thay đổi kỳ lạ giữa Postgres 8 và 9?
Tôi nghi ngờ EntityManager gọi phương thức 'PreparedStatement.setXXX()' sai cho giá trị NULL. Bạn cũng có thể thử trình điều khiển JDBC 8.1. Btw: bạn có biết rằng 8.1 không còn được hỗ trợ? –
Bạn có thể làm rõ hai đoạn đầu tiên của mình không? Họ dường như không có ý nghĩa. –
Cùng một mã làm việc tốt với PostgreSQL 9+ (@a_horse_with_no_name Khách hàng phải có 8.1 ...), Windows 7 vv.Nếu entity.getHistory() là "" thay vì null nó hoạt động. Cùng một chèn được thực hiện từ pgAdmin hoạt động tốt. – laidlook