sql >> データベース >  >> RDS >> Oracle

org.hibernate.Query .iterate()VS .getResultList()クエリの生成

    これはHibernate APIの問題ではないようです 、実際にはこれが望ましい動作です。

    Query.iterate()

    クエリ結果をIteratorとして返します 。クエリに複数の結果が前行に含まれている場合、結果はObject[]のインスタンスで返されます 。Entities 結果がオンデマンドで初期化されるときに返されます。最初のSQLクエリはidentifiersを返します のみ。

    1+N SQLを実行します クエリ。最初のクエリはすべてのレコードの識別子のみを返し、返されたイテレータが繰り返されると、WHERE id=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
    }
    

    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);
    }
    



    1. PHP変数タイプをMYSQLデータ型と照合します

    2. Oracleでクエリ結果をコンマ区切りリストとして返す

    3. デフォルト以外のNLS_NUMERIC_CHARACTERSを使用してOraclePL/ SQLでテキストを数値に効率的に変換するにはどうすればよいですか?

    4. 重複する値のリスト数