Có vẻ như bạn đang truyền đối số bằng cách nối chúng trực tiếp vào chuỗi. Đây là một ý tưởng rất tồi, vì nó có thể dẫn đến việc tiêm SQL. Luôn sử dụng PreparedStatement
s
với ?
trình giữ chỗ để chuyển các tham số, không bao giờ chuyển trực tiếp chúng bằng cách nối chúng trực tiếp vào chuỗi truy vấn (hơn thế nữa, bạn cần '
dấu phân cách xung quanh).
Bạn có thể có một cái gì đó như:
PreparedStatement stmt
= con.prepareStatement("SELECT id FROM Bookings WHERE checkIn=?")
stmt.setDate(1, new java.sql.Date(cin.getTime()));
// ? parameters are indexed from 1
ResultSet results = stmt.executeQuery();
Ngoài ra, chuyển đổi ngày nội bộ PostgreSQL thường khá tốt và linh hoạt. Bạn có thể truyền tham số chuỗi thành một ngày với PostgreSQL:
PreparedStatement stmt
= con.prepareStatement("SELECT id FROM Bookings WHERE checkIn=CAST(? AS DATE)");
stmt.setString(1, cinDate);
ResultSet results = stmt.executeQuery();
Điều này linh hoạt, nhưng có thể không dẫn đến kết quả chính xác mà bạn cần tùy thuộc vào định dạng ngày (bạn có thể kiểm tra hướng dẫn sử dụng PostgreSQL để biết chi tiết về các định dạng chuyển đổi ngày). Tuy nhiên, định dạng đầu vào bạn đang sử dụng sẽ hoạt động tốt (Hãy thử SELECT CAST('2012-05-01' AS DATE)
trực tiếp trong PostgreSQL, chẳng hạn, điều này sẽ trả về một ngày PostgreSQL chính xác.)
Lưu ý rằng khi sử dụng new java.sql.Date(cin.getTime())
, bạn có thể gặp phải các vấn đề về múi giờ. Bạn có thể sử dụng java.sql.Date.valueOf(...)
quá.
Để làm rõ, hãy theo dõi chỉnh sửa của bạn:
Điều này sẽ không hoạt động, vì ngày tháng sẽ là một phần của chính cú pháp SQL, không phải chuỗi hoặc ngày:"SELECT * FROM Rooms r where r.id not in (select * from search(" + cin +", " + cout +"))"
Ít nhất bạn cần sử dụng '
dấu ngoặc kép: . Ở một mức độ nào đó, bạn có thể mong đợi các tham số được định dạng đúng cách, nhưng đừng làm như vậy. Ngoài ra, sẽ vẫn phải truyền chuỗi bằng cách sử dụng "SELECT * FROM Rooms r where r.id not in (select * from search("' + cin +"', '" + cout +"'))"
CAST('...' AS DATE)
hoặc '...'::DATE
.
Cách đơn giản nhất chắc chắn sẽ là:
String searchQuery = "SELECT * FROM Rooms r where r.id not in (select SOMETHING from search(CAST(? AS DATE), CAST(? AS DATE)))";
PreparedStatement ps = conn.prepareStatement(searchQuery);
ps.setString(1, cinDate);
ps.setString(2, coutDate);
(Như a_horse_with_no_name đã chỉ ra trong một nhận xét, truy vấn chung sẽ không hoạt động do lựa chọn bên trong của bạn.)