簡體   English   中英

SELECT特定行sql查詢Java 8

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM