1

関数ベースのインデックスを持つデータ テーブルがあります (データベースは Oracle)。しかし、Java EE ejb アプリケーションでは、システムは jpa クエリを使用してデータにアクセスします。

しかし、完全なテーブル スキャンを実行する代わりにオラクルに関数ベースのインデックスを使用させるには、sql クエリの WHERE 句のインデックスで定義された関数を使用して sql を生成するように jpa コンテナーに指示する方法が必要です。

私の知る限り、そのような生成されたクエリでカスタマイズを作成するには、ネイティブ クエリを使用する必要があります。しかし、ネイティブ クエリを使用するには、多くのコードを変更する必要があります。この問題を解決するための他の回避策を提案してもらえますか?

インデックス: (Dev_Id + Dev_Type に対して一意の制約を適用する必要がありましたが、Dev_Type が重複している場合でも、Dev_Id が null になることがあります。)

 (NVL2(Dev_Id, Dev_Id, NULL), NVL2(Dev_Id, Dev_Type, NULL))

必要なクエリ: (インデックスを使用するため)

Select * from some_table where NVL2(Dev_Id, Dev_Id, NULL) = 'some_val';

コンテナ生成クエリ:

Select * from some_table where Dev_Id = 'some_val';
4

2 に答える 2

1

たぶん、ビューを作成し、JPAにそれを通過させることはオプションですか?

 CREATE VIEW SOME_VIEW AS SELECT SOME_TABLE.*,  
    NVL2(Dev_Id, Dev_Id, NULL) AS NVL_DEV_ID FROM SOME_TABLE;


 SELECT * FROM SOME_VIEW WHERE NVL_DEV_ID = ?

または、関数に評価されるテーブル上の仮想列ですか?

于 2012-10-31T03:49:50.337 に答える