次のうちどれが良いですか(EJB 3 JPA)
//クエリ
a)。 getEntityManager()。createQuery( "select o from User o");
// findAllUserがエンティティレベルで定義されている名前付きクエリ
b)。 getEntityManager()。createNamedQuery( "User.findAllUser"); **
//ネイティブクエリ
c)。 getEntityManager()。createNativeQuery( "SELECT * FROM TBLMUSER");
どの場合にどのアプローチが優れているか説明してください。
動的クエリの作成に使用する必要があります。
//Example dynamic query
StringBuilder builder = new StringBuilder("select e from Employee e");
if (empName != null) {
builder.append(" where e.name = ?");
}
getEntityManager().createQuery(builder.toString());
これは、名前で再利用できる定数変数のようなものです。 「すべてのユーザーを検索」、「IDで検索」などの一般的なデータベース呼び出しで使用する必要があります。
これにより、基になるデータベースのSQLスクリプト言語サポートに完全に依存するクエリが作成されます。これは、複雑なクエリが必要で、JPQL構文でサポートされていない場合に役立ちます。
ただし、基盤となるデータベースが変更された場合、アプリケーションに影響を与え、より多くの作業が必要になる可能性があります。たとえば、開発環境がMySQLで、本番環境がOracleを使用している場合です。さらに、結果が複数ある場合、返される結果のバインディングは複雑になる可能性があります。
ネイティブSQLは、Hibernate/JPAクエリよりも高速であるとは限りません。 Hibernate/JPAクエリも最終的にSQLに変換されます。場合によっては、Hibernate/JPAが最も効率的なステートメントを生成しないために発生する可能性があるため、ネイティブSQLの方が高速になる可能性があります。より効率的なSQLステートメントを生成するためのクエリマッピングとHQLステートメント。一方、ネイティブSQLの場合、Hibernateキャッシュがありません。その結果、場合によっては、ネイティブSQLがHibernate/JPAクエリよりも遅くなることがあります。
私はパフォーマンスについていません。ほとんどの場合、パフォーマンスについては、すべての列をロードするか、必要な列のみをロードするかは関係ありません。データベースアクセスでは、行を検索するときに時間は失われ、アプリケーションにデータを転送するときは失われません。必要な列のみを読み取る場合。
名前付きクエリはクエリと同じです。それらは、それらを再利用可能にするためだけに名前が付けられています+それらはさまざまな場所で宣言できます。クラスマッピング、confファイルなど(actaulコードを変更せずにクエリを変更できる)
ネイティブクエリはネイティブクエリであり、JPAクエリが行うすべての処理を実行する必要があります。値のバインドや引用など+ DBMPに依存しない構文(ケースではJPQL)を使用するため、データベースシステムの変更(MySQLからPostgresqlまたはH2へのsaqの変更)では、ネイティブクエリの書き換えが(必ずしも)必要ないため、必要な作業が少なくなります。
私にとっては、最初の2つは明らかにJPQLクエリです。2つ目は、エンティティマネージャーが永続性ユニットのロード中にクエリをコンパイル(および検証)することを意味します。
また、一部のIDEでサポートを受けることができ、オブジェクト表記(例:_select b from EntityA a left join a.entityB b
_)およびオブジェクトリレーショナルマッピングによって導入されるその他の奇妙な要素(コレクション、インデックスなど)をサポートします。
一方、JPQLのコーナーケース(select id, partition by (group_id) from table
などのウィンドウ関数のような)で最後の手段としてネイティブクエリを使用します。