Tôi nghĩ rằng vấn đề là kiểu dữ liệu của bạn là CHAR (9) và "Waterloo" chỉ có 8 ký tự. Tôi giả sử rằng điều này sẽ trả lại kết quả mong đợi (LIKE và%). Hoặc thêm không gian bị thiếu.
String sql = "SELECT STUDENT FROM SCHOOL WHERE SCHOOL LIKE ? ";
PreparedStatement prepStmt = conn.prepareStatement(sql);
prepStmt.setString(1, "Waterloo%");
ResultSet rs = prepStmt.executeQuery();
Cách tốt nhất là sử dụng varchar thay vì char nếu Chuỗi của bạn có độ dài linh hoạt. Sau đó, PreparedStatement sẽ hoạt động như mong đợi.
Một giải pháp khác sẽ là sử dụng phương thức setFixedCHAR cụ thể của Oracle (nhưng tốt hơn nên thay đổi kiểu dữ liệu thành varchar nếu có thể).
Sau đây là từ JavaDoc's PreparedStatement của Oracle:
Dữ liệu CHAR trong cơ sở dữ liệu được đệm vào chiều rộng cột. Điều này dẫn đến hạn chế trong việc sử dụng phương thức setCHAR () để liên kết dữ liệu ký tự vào mệnh đề WHERE của câu lệnh SELECT - dữ liệu ký tự trong mệnh đề WHERE cũng phải được đệm vào chiều rộng cột để tạo ra kết quả khớp trong câu lệnh SELECT. Điều này đặc biệt rắc rối nếu bạn không biết chiều rộng của cột.
setFixedCHAR () khắc phục điều này. Phương thức này thực hiện so sánh không đệm.
Ghi chú:
- Hãy nhớ truyền đối tượng câu lệnh đã chuẩn bị của bạn tới OraclePreparedStatement để sử dụng phương thức setFixedCHAR ().
- Không cần sử dụng setFixedCHAR () cho câu lệnh INSERT. Cơ sở dữ liệu luôn tự động chèn dữ liệu vào chiều rộng cột khi nó chèn vào.
Ví dụ sau minh họa sự khác biệt giữa các phương thức setString (), setCHAR () và setFixedCHAR ().
// Schema is : create table my_table (col1 char(10));
// insert into my_table values ('JDBC');
PreparedStatement pstmt = conn.prepareStatement
("select count() from my_table where col1 = ?");
ResultSet rs;
pstmt.setString (1, "JDBC"); // Set the Bind Value
rs = pstmt.executeQuery(); // This does not match any row
// ... do something with rs
CHAR ch = new CHAR("JDBC ", null);
((OraclePreparedStatement)pstmt).setCHAR(1, ch); // Pad it to 10 bytes
rs = pstmt.executeQuery(); // This matches one row
// ... do something with rs
((OraclePreparedStatement)pstmt).setFixedCHAR(1, "JDBC");
rs = pstmt.executeQuery(); // This matches one row
// ... do something with rs