9

JPA2.0でネイティブクエリを使用するタイミングと使用しないタイミングについて非常に混乱しています。ネイティブクエリを使用すると、JPAキャッシュと同期しなくなる可能性があるという印象を受けました。JPQLまたはCriteriaBuilderクエリで同じことを実行できる場合、ネイティブクエリを使用する正当な理由はありますか?同様に、JPQLまたはCriteriaBuilderで同じことを実行できる場合、ネイティブクエリを使用することに危険はありますか?そして最後に、JPAキャッシュと同期しなくなるまでネイティブクエリを使用することに危険がある場合、JPQLまたはCriteriaBuilderで同等のクエリを実行するときに同じ危険が存在しますか?

私の哲学はネイティブクエリを避けることでしたが、確かにそれらが必要な場合があります。JPQLやCriteriaBuilderでできるのなら、そうすべきだと思います。

ありがとう。

4

1 に答える 1

14

私はあなたの哲学に同意します。

ネイティブクエリの主な問題であるIMHOは、保守性です。まず第一に、それらは一般的にJPQLクエリよりも複雑で長いです。ただし、クラス名とプロパティ名を使用するのではなく、テーブル名と列名もハードコーディングします。

JPQLクエリは、クラス名とプロパティ名を文字列にハードコーディングするため、リファクタリング時にすでに問題があります。ただし、ネイティブクエリは、テーブル名と列名をどこにでもハードコーディングするため、さらに悪化します。

ネイティブの選択クエリはキャッシュに関して問題ではないと思います。ただし、ネイティブの更新、挿入、および削除のクエリは、第1レベルと第2レベルのキャッシュの背後にあるデータを変更するため問題になります。したがって、これらは古くなる可能性があります。

もう1つの問題は、ネイティブクエリが、あるデータベースでは認識されるが別のデータベースでは認識されない構文を使用する可能性があるため、アプリケーションをあるデータベースから別のデータベースに移行するのが難しくなることです。

于 2012-03-03T15:12:12.713 に答える