web-dev-qa-db-ja.com

名前付きクエリまたはネイティブクエリまたはクエリパフォーマンスの点でどちらが優れていますか?

次のうちどれが良いですか(EJB 3 JPA)

//クエリ

a)。 getEntityManager()。createQuery( "select o from User o");

// findAllUserがエンティティレベルで定義されている名前付きクエリ

b)。 getEntityManager()。createNamedQuery( "User.findAllUser"); **

//ネイティブクエリ

c)。 getEntityManager()。createNativeQuery( "SELECT * FROM TBLMUSER");

どの場合にどのアプローチが優れているか説明してください。

14
Jekin Kalariya
  1. createQuery()

    動的クエリの作成に使用する必要があります。

    //Example dynamic query
    StringBuilder builder = new StringBuilder("select e from Employee e");
    if (empName != null) {
        builder.append(" where e.name = ?");
    }
    getEntityManager().createQuery(builder.toString());
    
  2. createNamedQuery()

    これは、名前で再利用できる定数変数のようなものです。 「すべてのユーザーを検索」、「IDで検索」などの一般的なデータベース呼び出しで使用する必要があります。

  3. createNativeQuery()

    これにより、基になるデータベースのSQLスクリプト言語サポートに完全に依存するクエリが作成されます。これは、複雑なクエリが必要で、JPQL構文でサポートされていない場合に役立ちます。

    ただし、基盤となるデータベースが変更された場合、アプリケーションに影響を与え、より多くの作業が必要になる可能性があります。たとえば、開発環境がMySQLで、本番環境がOracleを使用している場合です。さらに、結果が複数ある場合、返される結果のバインディングは複雑になる可能性があります。

27
Wundwin Born

ネイティブSQLは、Hibernate/JPAクエリよりも高速であるとは限りません。 Hibernate/JPAクエリも最終的にSQLに変換されます。場合によっては、Hibernate/JPAが最も効率的なステートメントを生成しないために発生する可能性があるため、ネイティブSQLの方が高速になる可能性があります。より効率的なSQLステートメントを生成するためのクエリマッピングとHQLステートメント。一方、ネイティブSQLの場合、Hibernateキャッシュがありません。その結果、場合によっては、ネイティブSQLがHibernate/JPAクエリよりも遅くなることがあります。

私はパフォーマンスについていません。ほとんどの場合、パフォーマンスについては、すべての列をロードするか、必要な列のみをロードするかは関係ありません。データベースアクセスでは、行を検索するときに時間は失われ、アプリケーションにデータを転送するときは失われません。必要な列のみを読み取る場合。

1
Kirtan Patel

名前付きクエリはクエリと同じです。それらは、それらを再利用可能にするためだけに名前が付けられています+それらはさまざまな場所で宣言できます。クラスマッピング、confファイルなど(a​​ctaulコードを変更せずにクエリを変更できる)

ネイティブクエリはネイティブクエリであり、JPAクエリが行うすべての処理を実行する必要があります。値のバインドや引用など+ DBMPに依存しない構文(ケースではJPQL)を使用するため、データベースシステムの変更(MySQLからPostgresqlまたはH2へのsaqの変更)では、ネイティブクエリの書き換えが(必ずしも)必要ないため、必要な作業が少なくなります。

1
Antoniossss

私にとっては、最初の2つは明らかにJPQLクエリです。2つ目は、エンティティマネージャーが永続性ユニットのロード中にクエリをコンパイル(および検証)することを意味します。

また、一部のIDEでサポートを受けることができ、オブジェクト表記(例:_select b from EntityA a left join a.entityB b_)およびオブジェクトリレーショナルマッピングによって導入されるその他の奇妙な要素(コレクション、インデックスなど)をサポートします。

一方、JPQLのコーナーケース(select id, partition by (group_id) from tableなどのウィンドウ関数のような)で最後の手段としてネイティブクエリを使用します。

0
NoDataFound