Мисля, че проблемът е, че вашият тип данни е CHAR(9) и "Waterloo" има само 8 знака. Предполагам, че това ще върне очакваните резултати (КАТО и %). Или добавете липсващото пространство.
String sql = "SELECT STUDENT FROM SCHOOL WHERE SCHOOL LIKE ? ";
PreparedStatement prepStmt = conn.prepareStatement(sql);
prepStmt.setString(1, "Waterloo%");
ResultSet rs = prepStmt.executeQuery();
Най-добрият начин би бил да използвате varchar вместо char, ако вашите низове имат гъвкава дължина. Тогава PreparedStatement ще работи според очакванията.
Заобиколно решение би било да се използва специфичният за Oracle метод setFixedCHAR (но е по-добре да промените типа данни на varchar, ако е възможно).
Следното е от Oracle's PreparedStatement JavaDoc:
CHAR данните в базата данни се допълват до ширината на колоната. Това води до ограничение при използването на метода setCHAR() за обвързване на символни данни в клаузата WHERE на оператор SELECT - данните за символи в клаузата WHERE също трябва да бъдат подплатени до ширината на колоната, за да се получи съвпадение в израза SELECT. Това е особено обезпокоително, ако не знаете ширината на колоната.
setFixedCHAR() коригира това. Този метод изпълнява неподплатено сравнение.
Бележки:
- Не забравяйте да прехвърлите вашия подготвен обект на израз към OraclePreparedStatement, за да използвате метода setFixedCHAR().
- Няма нужда да използвате setFixedCHAR() за оператор INSERT. Базата данни винаги автоматично допълва данните до ширината на колоната, докато ги вмъква.
Следващият пример демонстрира разликата между методите setString(), setCHAR() и 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