ऐसा लगता है कि यह Hibernate API
के साथ कोई समस्या नहीं है , वास्तव में यह वांछित व्यवहार है।
Query.iterate() :
क्वेरी परिणामों को Iterator
. के रूप में लौटाएं . यदि क्वेरी में एक से अधिक परिणाम पूर्व पंक्ति में हैं, तो परिणाम Object[]
. के उदाहरण में लौटाए जाते हैं .Entities
मांग पर परिणाम आरंभिक होने पर लौटा दिया जाता है। पहली SQL क्वेरी identifiers
लौटाती है केवल।
1+N SQL
निष्पादित करता है प्रश्न। पहली क्वेरी केवल सभी रिकॉर्ड्स के पहचानकर्ता को लौटाती है और जब लौटा हुआ पुनरावर्तक पुनरावृत्त होता है तो हर बार एक अलग SQL क्वेरी निष्पादित की जाती है जिसमें WHERE id=N
जैसे WHERE क्लॉज होते हैं। . यदि रिकॉर्ड कैश में मौजूद हैं तो पहली क्वेरी निष्पादित की जाती है और शेष एन क्वेरी निष्पादित नहीं की जाती हैं और रिकॉर्ड कैश से प्राप्त किए जाते हैं।
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
और संपूर्ण डेटा लोड करता है। भले ही रिकॉर्ड कैश में मौजूद हों, डेटाबेस से रिकॉर्ड लोड करने के लिए एक नई SQL क्वेरी निष्पादित की जाती है।
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);
}