Jeg tror, problemet er, at din datatype er CHAR(9) og "Waterloo" kun har 8 tegn. Jeg antager, at dette ville returnere de forventede resultater (LIKE og %). Eller tilføj det manglende mellemrum.
String sql = "SELECT STUDENT FROM SCHOOL WHERE SCHOOL LIKE ? ";
PreparedStatement prepStmt = conn.prepareStatement(sql);
prepStmt.setString(1, "Waterloo%");
ResultSet rs = prepStmt.executeQuery();
Den bedste måde ville være at bruge varchar i stedet for char, hvis dine strenge har en fleksibel længde. Så ville PreparedStatement fungere som forventet.
En løsning ville være at bruge den Oracle-specifikke setFixedCHAR-metode (men det er bedre at ændre datatypen til varchar, hvis det er muligt).
Følgende er fra Oracles PreparedStatement JavaDoc:
CHAR-data i databasen er polstret til kolonnebredden. Dette fører til en begrænsning i at bruge setCHAR()-metoden til at binde tegndata til WHERE-udtrykket i en SELECT-sætning - tegndataene i WHERE-udtrykket skal også udfyldes til kolonnebredden for at skabe et match i SELECT-sætningen. Dette er især besværligt, hvis du ikke kender søjlebredden.
setFixedCHAR() afhjælper dette. Denne metode udfører en ikke-polstret sammenligning.
Bemærkninger:
- Husk at caste dit forberedte sætningsobjekt til OraclePreparedStatement for at bruge setFixedCHAR()-metoden.
- Der er ingen grund til at bruge setFixedCHAR() til en INSERT-sætning. Databasen udfylder altid automatisk dataene til kolonnebredden, når den indsætter dem.
Det følgende eksempel viser forskellen mellem metoderne setString(), setCHAR() og 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