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”完全是误导性的。 –