Đây dường như không phải là vấn đề với Hibernate API
, biến điều này thành hành vi mong muốn.
Query.iterate () :
Trả về kết quả truy vấn dưới dạng Iterator
. Nếu truy vấn chứa nhiều kết quả ở hàng trước, kết quả được trả về trong một bản sao của Object[]
. Entities
trả về khi kết quả được khởi tạo theo yêu cầu. Truy vấn SQL đầu tiên trả về identifiers
chỉ.
Thực thi 1+N SQL
truy vấn. Truy vấn đầu tiên chỉ trả về mã định danh của tất cả các bản ghi và khi trình lặp trả về được lặp lại thì mỗi lần thực thi truy vấn SQL riêng biệt có chứa mệnh đề WHERE như WHERE id=N
. Nếu các bản ghi có trong bộ đệm thì truy vấn đầu tiên sẽ được thực thi và N truy vấn còn lại sẽ không được thực thi và các bản ghi được lấy từ bộ đệm.
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
và tải toàn bộ dữ liệu. Ngay cả khi các bản ghi có trong bộ đệm, một truy vấn SQL mới sẽ được thực thi để tải các bản ghi từ cơ sở dữ liệu.
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);
}