Ini sepertinya bukan masalah dengan Hibernate API
, ternyata ini perilaku yang diinginkan.
Query.iterate() :
Kembalikan hasil kueri sebagai Iterator
. Jika kueri berisi beberapa hasil pra baris, hasilnya dikembalikan dalam sebuah instance dari Object[]
.Entities
dikembalikan karena hasil diinisialisasi sesuai permintaan. Kueri SQL pertama mengembalikan identifiers
saja.
Menjalankan 1+N SQL
pertanyaan. Kueri pertama hanya mengembalikan pengidentifikasi semua catatan dan ketika iterator yang dikembalikan diulang maka setiap kali kueri SQL terpisah dijalankan yang berisi klausa WHERE seperti WHERE id=N
. Jika record ada dalam cache maka query pertama dijalankan dan query N sisanya tidak dieksekusi dan record diperoleh dari cache.
Iterator<Employee> iterator1 = session.createQuery("from Employee").iterate(); // SELECT EMP_ID FROM EMP
while(iterator1.hasNext()) {
System.out.println(iterator1.next()); // SELECT * FROM EMP WHERE EMP_ID=?
}
Iterator<Employee> iterator2 = session.createQuery("from Employee").iterate(); // SELECT EMP_ID FROM EMP
while (iterator2.hasNext()) {
System.out.println(iterator2.next()); // From cache, no SQL
}
Query.getResultList() :Executes 1 SQL query
dan memuat seluruh data. Bahkan jika catatan ada dalam cache, kueri SQL baru dijalankan untuk memuat catatan dari database.
List<Employee> list1 = session.createQuery("from Employee").list(); // SELECT *FROM EMP
for (Employee e : list1) {
System.out.println(e);
}
List<Employee> list2 = session.createQuery("from Employee").list(); // SELECT *FROM EMP
for (Employee e : list2) {
System.out.println(e);
}