[英]SELECT specific rows sql query Java 8
我必須從Oracle DB中提取一些特定的數據。 我正在使用Java8。我必須考慮TABLE中的3列:flag | date_1 | 日期2。 該標志的值可以為1,2或3( 標志值在一段時間內或根據某些事件從1-> 2-> 3更新)。
對於兩個dateTime值X和Y,我需要從表中提取日期值在X和Y之間的所有行。如果標志值為1或2,則date_1必須在X&Y之間,而與date_2無關。 但是,如果標志值為3,則date_2必須介於X和Y之間,而與date_1無關。
為此,我創建了三個具有不同參數的不同查詢,分別為flag = 1 / flag = 2 / flag = 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的Lambda函數僅從列表中過濾值。 有什么建議嗎?
謝謝您的幫助。
如果我正確理解,您實際上有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)
這會將整個事情減少到僅一個查詢...根據數據集,可能仍然效率低下。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.