Query.list()
との使用の違いは何Query.iterator()
ですか?
どちらを使用してもパフォーマンスが向上しますか。つまり、遅延読み込みを実装している人はいますか?
またはQuery.iterator()は最終的に同じですquery.list().iterate()
また、なぜCriteria.iterator()
Criteria.list()
Query.list()
との使用の違いは何Query.iterator()
ですか?
どちらを使用してもパフォーマンスが向上しますか。つまり、遅延読み込みを実装している人はいますか?
またはQuery.iterator()は最終的に同じですquery.list().iterate()
また、なぜCriteria.iterator()
Criteria.list()
Query.list(): 1つのSQLクエリを実行し、データ全体をロードします。レコードがキャッシュに存在する場合でも、データベースからレコードをロードするために新しい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);
}
Query.iterate(): 1 +NSQLクエリを実行します。最初のクエリはすべてのレコードの識別子のみを返し、返されたイテレータが繰り返されると、「WHEREid=N」のようなWHERE句を含む個別のSQLクエリが実行されるたびに返されます。レコードがキャッシュに存在する場合、最初のクエリが実行され、残りのN個のクエリは実行されず、レコードはキャッシュから取得されます。
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
}
インスタンスがすでにセッション内にある場合 (一次キャッシュ) または二次キャッシュiterate()
を使用すると、パフォーマンスが向上します。
それらがまだキャッシュされていない場合は、単純なクエリiterate()
よりも遅くなり、list()
多くのデータベース ヒットが必要になる場合があります。
javadoc は次のように述べています。
クエリ結果を Iterator として返します。クエリに行の前に複数の結果が含まれる場合、結果は Object[] のインスタンスで返されます。
結果として返されるエンティティは、オンデマンドで初期化されます。最初の SQL クエリは識別子のみを返します。
(私のものを強調)
+----------------------------------------------+-----------------------------------------------+
| list() | iterate() |
+----------------------------------------------+-----------------------------------------------+
| Return type is List | Return type is Iterate |
| All records loads at single database request | For each record, one database hit is made |
| This is faster if cache is not available | This is very slower if cache is not available |
| Eager loading | Lazy loading |
+----------------------------------------------+-----------------------------------------------+
list() の場合:
Query query = session.createQuery("from Employee");
List list = query.list(); // SELECT * FROM EMP
Iterator iterator = list.iterator();
while(iterator.hasNext()){
}
iterate() の場合:
Query query = session.createQuery("from Employee");
Iterator iterator = query.iterate(); // SELECT * FROM EMP
while(iterator.hasNext()){
// SELECT * FROM EMP WHERE EMP_ID=?
}