Saya pikir masalahnya adalah tipe data Anda adalah CHAR(9) dan "Waterloo" hanya memiliki 8 karakter. Saya berasumsi bahwa ini akan mengembalikan hasil yang diharapkan (LIKE dan %). Atau tambahkan ruang yang hilang.
String sql = "SELECT STUDENT FROM SCHOOL WHERE SCHOOL LIKE ? ";
PreparedStatement prepStmt = conn.prepareStatement(sql);
prepStmt.setString(1, "Waterloo%");
ResultSet rs = prepStmt.executeQuery();
Cara terbaik adalah dengan menggunakan varchar daripada char jika String Anda memiliki panjang yang fleksibel. Maka Pernyataan Siap akan berfungsi seperti yang diharapkan.
Solusinya adalah dengan menggunakan metode setFixedCHAR khusus Oracle (tetapi lebih baik mengubah tipe data menjadi varchar jika memungkinkan).
Berikut ini adalah dari Oracle's PreparedStatement JavaDoc:
Data CHAR dalam database diisi dengan lebar kolom. Hal ini menyebabkan batasan dalam menggunakan metode setCHAR() untuk mengikat data karakter ke dalam klausa WHERE dari pernyataan SELECT--data karakter dalam klausa WHERE juga harus diisi ke lebar kolom untuk menghasilkan kecocokan dalam pernyataan SELECT. Ini sangat merepotkan jika Anda tidak mengetahui lebar kolom.
setFixedCHAR() memperbaiki ini. Metode ini menjalankan perbandingan tanpa bantalan.
Catatan:
- Ingatlah untuk mentransmisikan objek pernyataan yang Anda siapkan ke OraclePreparedStatement untuk menggunakan metode setFixedCHAR().
- Tidak perlu menggunakan setFixedCHAR() untuk pernyataan INSERT. Basis data selalu secara otomatis memasukkan data ke lebar kolom saat dimasukkan.
Contoh berikut menunjukkan perbedaan antara metode setString(), setCHAR() dan 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