tl; dr
myPreparedStatement.setObject(
… ,
java.util.UUID.randomUUID()
)
Chi tiết
(a) Cho chúng tôi xem mã của bạn.
PreparedStatement::setObject
không hoạt động khi truyền một java.util.UUID
. Bạn có thể gặp một số vấn đề khác trong mã của mình.
(b) Xem bài đăng trên blog của tôi Giá trị UUID Từ JDBC đến Postgres để biết một chút thảo luận và mã ví dụ.
// Generate or obtain data to store in database.
java.util.UUID uuid = java.util.UUID.randomUUID(); // Generate a random UUID.
String foodName = "Croissant";
// JDBC Prepared Statement.
PreparedStatement preparedStatement = conn.prepareStatement( "INSERT INTO food_ (pkey_, food_name_ ) VALUES (?,?)" );
int nthPlaceholder = 1; // 1-based counting (not an index).
preparedStatement.setObject( nthPlaceholder++, uuid );
preparedStatement.setString( nthPlaceholder++, foodName );
// Execute SQL.
if ( !( preparedStatement.executeUpdate() == 1 ) ) {
// If the SQL reports other than one row inserted…
this.logger.error( "Failed to insert row into database." );
}
(c) Tôi không chắc bạn muốn nói gì
Trình điều khiển Java JDBC mới nhất cho postgres tuyên bố hỗ trợ UUID nguyên bản
Lái xe nào? Có ít nhất hai trình điều khiển JDBC mã nguồn mở cho Postgres, trình điều khiển hiện tại / kế thừa và trình điều khiển viết lại mới "thế hệ tiếp theo". Và còn có các trình điều khiển thương mại khác.
"nguyên bản"? Bạn có thể liên kết đến tài liệu bạn đọc được không? Thông số SQL không có kiểu dữ liệu cho UUID (không may là ☹), do đó thông số JDBC không có kiểu dữ liệu cho UUID. Như một giải pháp thay thế, trình điều khiển JDBC cho Postgres sử dụng setObject
và getObject
các phương thức trên PreparedStatement di chuyển UUID qua khe giữa Java ↔ SQL ↔ Postgres. Xem mã ví dụ ở trên.
Như tài liệu JDBC của PreparedStatement cho biết:
Nếu cần chuyển đổi kiểu tham số tùy ý, phương thức setObject nên được sử dụng với kiểu SQL đích.
Có lẽ do "tự nhiên", bạn đã nhầm lẫn giữa hỗ trợ gốc của Postgres cho UUID là một kiểu dữ liệu với JDBC có kiểu dữ liệu UUID. Postgres thực sự hỗ trợ UUID như một kiểu dữ liệu, có nghĩa là giá trị được lưu trữ dưới dạng 128-bit thay vì nhiều lần nếu nó được lưu trữ dưới dạng chuỗi hex ASCII hoặc Unicode. Và là bản địa cũng có nghĩa là Postgres biết cách tạo chỉ mục trên một cột thuộc loại đó.
Điểm mấu chốt của bài đăng trên blog của tôi được đề cập ở trên là tôi rất ngạc nhiên bởi việc làm cầu nối giữa Java ↔ SQL ↔ Postgres
đơn giản như thế nào. . Trong những lần đầu tiên thất học, tôi đã làm việc quá chăm chỉ.
Một lưu ý khác về việc Postgres hỗ trợ UUID… Postgres biết cách lưu trữ, lập chỉ mục và truy xuất các giá trị UUID hiện có. Để tạo Giá trị UUID, bạn phải bật tiện ích mở rộng Postgres (plugin) uuid-ossp
. Phần mở rộng này bao bọc một thư viện do Dự án OSSP cung cấp để tạo ra nhiều loại giá trị UUID. Xem blog của tôi để biết hướng dẫn.
Nhân tiện…
Nếu tôi biết cách kiến nghị với nhóm chuyên gia JDBC hoặc nhóm JSR để JDBC biết về UUID, tôi chắc chắn sẽ làm như vậy. Họ chỉ đang làm điều đó đối với các loại ngày-giờ mới được định nghĩa trong JSR 310:API ngày và giờ.
Tương tự, nếu tôi biết cách kiến nghị ủy ban tiêu chuẩn SQL thêm một kiểu dữ liệu UUID, tôi sẽ làm. Nhưng rõ ràng ủy ban đó bí mật hơn Bộ Chính trị Liên Xô và chậm chạp hơn một sông băng.