9

Query.list()との使用の違いは何Query.iterator()ですか?

どちらを使用してもパフォーマンスが向上しますか。つまり、遅延読み込みを実装している人はいますか?

またはQuery.iterator()は最終的に同じですquery.list().iterate()

Criteria.iterator()また、なぜCriteria.list()

4

4 に答える 4

14

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
}
于 2013-03-23T16:27:56.540 に答える
5

インスタンスがすでにセッション内にある場合 (一次キャッシュ) または二次キャッシュiterate()を使用すると、パフォーマンスが向上します。

それらがまだキャッシュされていない場合は、単純なクエリiterate()よりも遅くなり、list()多くのデータベース ヒットが必要になる場合があります。

于 2013-02-19T12:34:59.693 に答える
3

javadoc は次のように述べています。

クエリ結果を Iterator として返します。クエリに行の前に複数の結果が含まれる場合、結果は Object[] のインスタンスで返されます。

結果として返されるエンティティは、オンデマンドで初期化されます。最初の SQL クエリは識別子のみを返します。

(私のものを強調)

于 2013-02-19T12:15:47.203 に答える
1
+----------------------------------------------+-----------------------------------------------+
|                    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=?
}
于 2016-05-27T08:13:13.830 に答える