2017-03-06 13 views
0

Oracle DBから特定のデータを抽出しました。私はJava 8を使用しています。 TABLEから3つの列を考慮する必要があります。 date_1 | date_2。 フラグは1,2または3の値を持つことができます(フラグの値は一定期間または特定のイベントに基づいて1-> 2-> 3から更新されます)。特定の行を選択するsqlクエリJava 8

言う2つの日時がXとYの値に対して、Iは、フラグ値が1又は2である場合は日付の値はXとY 間でその後DATE_1がX & Yの間でなければならないテーブルからすべての行を抽出する必要date_2とは関係ありません。しかし、フラグの値が3の場合、date_2は、date_1に関係なく、X & Yの間でなければなりません。

このため、flag = 1/flag = 2/flag = 3のように異なるパラメータで3つの異なるクエリを作成しました。しかし、これは非常に非効率的であるようです。

String sql1 = "SELECT new xxxx.xxxx.xxx.Java.class.xxx (" 
      + "t.flag, t.date_1, t.date_2)" 
      + "FROM Table t " 
      + "WHERE t.flag = :flagValue1 " 
      + "AND t.date_1 >= :X " 
      + "AND t.date_1 < :Y "; 
String sql2 = "SELECT new xxxx.xxxx.xxx.Java.class.xxx (" 
      + "t.flag, t.date_1, t.date_2)" 
      + "FROM Table t " 
      + "WHERE t.flag = :flagValue2 " 
      + "AND t.date_1 >= :X " 
      + "AND t.date_1 < :Y "; 
String sql3 = "SELECT new xxxx.xxxx.xxx.Java.class.xxx (" 
      + "t.flag, t.date_1, t.date_2)" 
      + "FROM Table t " 
      + "WHERE t.flag = :flagValue3 " 
      + "AND t.date_2 >= :X " 
      + "AND t.date_2 < :Y "; 
List<E> list1 = this.entityManger.createQuery(sql1, model.class) 
       .setParameter("1", flag1) 
       .setParameter("X", firstDateValue) 
       .setParameter("Y", secondDateValue) 
       .getResultList(); 
List<E> list2 = this.entityManger.createQuery(sql2, model.class) 
       .setParameter("2", flag2) 
       .setParameter("X", firstDateValue) 
       .setParameter("Y", secondDateValue) 
       .getResultList(); 
List<E> list3 = this.entityManger.createQuery(sql3, model.class) 
       .setParameter("3", flag3) 
       .setParameter("X", firstDateValue) 
       .setParameter("Y", secondDateValue) 
       .getResultList(); 
List<E> finalList = new ArrayList<>(); 
     finalList.addAll(list1); 
     finalList.addAll(list2); 
     finalList.addAll(list3); 
return finalList; 

他の方法がありますか?これに対してより良い(単一の)クエリーができますか?

PS:リストから値をフィルタリングするためにJava 8のラムダ関数を使用できるのだろうかと思います。これに関する提案はありますか?

ありがとうございました。

+0

't.flag IN(:flagValue1、:flagValue2、:flagValue3)はどうですか? –

+0

大きなデータセットはここでどのように話していますか?何千万? – Tschallacka

+1

またはWHERE句に "OR"を使用すると、1つのクエリが存在します。 FWIWこれはSQLではないので、変数を "sqlX"とラベルするのはまったく誤解を招きます。 –

答えて

0

実際には2つの入力パラメータX & Y(/から日付へ)が正しく理解されています。また、入力された日付に関するすべてのフラグの値を常に照会する必要があります。したがって、このようなクエリは、より効率的である:

select new Java.class.name (t.flag, t.date_1, t.date_2) from Table t 
where 
(t.flag in (1,2) and t.date_1 >= :X and t.date_1 < :Y) 
or 
(t.flag = 3 and t.date_1 2= :X and t.date_2 < :Y) 

これは単なる1クエリに全部を低減するであろう...まだデータセットに応じて効率的ではありません。