9

私はJPAORMを使用するプロジェクトで作業しており、フレームワークはクエリを作成するための2種類のメソッドを提供します。

  • entityManager.createQuery(query1);
  • entityManager.createNativeQuery(query2);

それらを使用するために渡されるクエリ文字列の種類は理解していますが、なぜネイティブクエリを作成する必要があるのか​​正確にはわかりません。おそらく、そこでORM機能を使用したくないのでしょうか。

4

3 に答える 3

14

必要がない限り、ネイティブクエリを作成する必要はありません。JPQLは最終的にフレームワークによってSQLに変換されますが、フレームワークではネイティブクエリを呼び出すこともできます。なぜそれをしたいのですか?

  • 低レベルのアクセス。これは、マッピングを自分で最適化して処理できることを意味します。SQLでは実際にデータベーステーブルにアクセスし、JPQLではエンティティオブジェクトにアクセスします。
  • SQLをすでに知っている場合は、JPQLを学びたくないかもしれません。
  • クエリはすでにSQLで記述されており、JPQLに移植するためのリソース/時間はありません。
于 2012-11-08T11:50:15.470 に答える
10

createQueryはJPA独自のクエリ言語を使用し、テーブル名の代わりにクラス名から選択します。これはSQLではなく、類似しており、後で実際のSQLに変換されます。Javaクラスへのマッピングは自動的に行われ、結果として実際のクラスインスタンスが返されます。

createNativeQueryは実際のSQLを使用するため、JPA機能を使用できなくなります。この方法は、JPAでサポートされていない本当に奇妙なことをする必要がある場合に一般的に使用されます。Object []のリストが返され、Javaオブジェクトへのマッピングは手動で行う必要があります。つまり、JPAが登場する前にDBを操作するのと同じように、接続処理が自動的に行われるため、少し便利です。

于 2012-11-08T11:46:21.357 に答える
5

私はそれを最適化の目的で使用しました。ネイティブクエリを使用するということは、ORMマッピングが適切に行われておらず、JPQLの代わりにDBのネイティブ構文を使用することを意味します。したがって、@ RasmusFrankeも指摘しているように、JPAでサポートされていないものが必要な場合(たとえば、DBベンダー固有の拡張機能を使用する場合、これは概念的には悪い考えです。JPAはすべてDBに依存しないためですが、それでも発生します。 。 知っている...)

これの他の効果は、ネイティブクエリを使用することにより、提供されたクエリのみが実行されることです。他のエンティティや他の不要なものを熱心に取得する必要はありません。このようにして、大量のオブジェクトを処理する場合、ヒープスペースを節約できます。

于 2012-11-08T11:50:45.500 に答える