2

私は JPA を初めて使用し、Web サービス用に単純な JPA 選択を作成しました。以前は従来の SQL ステートメントを使用していました。それは素晴らしかったです。確実な速度を得る方法を知っていましたが、現在、5 つの異なるプロジェクトで 3 つの異なるデータベースを使用しています。そのため、3 つの SQL 言語を知らなくても、JPA を学ぶことは 1 つのテクノロジを使用するのに適していると考えました。そこで、いくつかのテーブル、エンティティを作成し、JPA を使用しようとしました。しかし、最初の瞬間に何かが間違っていました-スピード。

(MSSQL 2008 を使用しています)

単純なネイティブ SQL select と JPA select を比較しました。

em.createNativeQuery("SELECT c.* FROM Table c", MyTable.class);

em.createQuery("SELECT c FROM Table c", MyTable.class)

createNativeQueryは 5 倍高速でしたが、なぜですか?

そこで、MSSQL パッケージに含まれている SQL プロファイラーを起動し、JPA が行っていることをデバッグしました。私は 100 レコードのテーブルを持っていますが、私が見たものには驚きました:

  • createNativeQueryデータベースへの1つのリクエストを作成し、結果はクエリで100レコードでした
  • createQuery100 のリクエストを作成し、すべてのリクエストが 1 つのレコードを返します。このようなもの:

    1 SELECT Col1, Col2 FROM TABLE WHERE (ID = ?)<br>
    2 SELECT Col1, Col2 FROM TABLE WHERE (ID = ?)<br>
    .
    .
    .
    100 SELECT Col1, Col2 FROM TABLE WHERE (ID = ?)
    

私はEclipse LinkでJPA 2を使用しています。これは、JPA がどのように機能するかについての通常の動作ですか? または、設定で何か間違ったことをしましたか。

4

3 に答える 3

1

これは、一度にすべての結果オブジェクトを使用する必要がないシナリオを最適化するために行われます。TopLink は最初にオブジェクト スケルトンをロードし、オブジェクトをトラバースするときに、オブジェクトをバックグラウンドで移入します。

すべてのオブジェクトを一度にロードしたい場合はQueryHint、以下が役立つと思います。

  Query query = em.createQuery("SELECT c FROM Table c", MyTable.class)
  query.setHint(QueryHints.BATCH_SIZE, 100); //set any appropriate batch size
于 2012-11-27T19:26:08.000 に答える
0

createNativeQueryあなたが提供したように、単純な例を使用するべきではありません。

このようなことを試してください(Query代わりに使用してください):

    Query agedUsers = em.createQuery( "SELECT u " + "FROM Users u "
            + "WHERE u.age = :age" );
    agedUsers.setParameter( "age", age);
    List<User> users = agedUsers.getResultList();

テーブル名はエンティティの名前であり、 の代わりにエイリアスを使用する必要があります*

于 2012-11-27T19:26:45.697 に答える