2017-03-06 79 views
0

我已經提取從Oracle數據庫的一些具體數據。我正在使用Java 8. 我必須考慮TABLE中的3列:flag | date_1 |日期2。 的標誌可具有值1,2或3(本標誌在一段時間值從1-> 2-> 3更新或基於某些事件)。選擇特定的行SQL查詢的Java 8

說爲兩個日期時間值X,Y,I需要從其中日期值是X和Y 之間的表中提取所有行如果標誌值是1或2,那麼DATE_1必須是X & Y之間不管date_2。但是,如果標誌值爲3,那麼無論date_1如何,date_2必須介於X & Y之間。

爲此,我創建具有不同參數作爲標誌= 1 /標記= 2 /標記= 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函數從列表僅僅是要過濾的值。對此有何建議?

感謝您的幫助。

+0

怎麼樣't.flag IN(:flagValue1,:flagValue2,:flagValue3)' –

+0

數據集有多大,我們談論在這裏?數千,數百萬? – Tschallacka

+1

或在WHERE子句中使用「OR」,則有1個查詢。 FWIW這不是SQL,因此將變量標記爲「sqlX」完全是誤導性的。 –

回答

0

如果我理解正確的是你確實有2個輸入參數X & Y(自/至日期AKA)。你總是想查詢關於輸入日期的所有標誌的值。因此,像這樣的查詢會更有效率:

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) 

這會減少整個事情只是一個查詢...依賴於數據集可能仍然是低效的。