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函數從列表僅僅是要過濾的值。對此有何建議?
感謝您的幫助。
怎麼樣't.flag IN(:flagValue1,:flagValue2,:flagValue3)' –
數據集有多大,我們談論在這裏?數千,數百萬? – Tschallacka
或在WHERE子句中使用「OR」,則有1個查詢。 FWIW這不是SQL,因此將變量標記爲「sqlX」完全是誤導性的。 –