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のラムダ関数を使用できるのだろうかと思います。これに関する提案はありますか?
ありがとうございました。
't.flag IN(:flagValue1、:flagValue2、:flagValue3)はどうですか? –
大きなデータセットはここでどのように話していますか?何千万? – Tschallacka
またはWHERE句に "OR"を使用すると、1つのクエリが存在します。 FWIWこれはSQLではないので、変数を "sqlX"とラベルするのはまったく誤解を招きます。 –