我要从Oracle DB中提取一些特定数据。我正在使用Java 8。 我必须从TABLE:flag |中考虑3列date_1 |日期2。 标志可以具有值1,2或3(标志值在一段时间内或根据某些事件从1-> 2-> 3更新)
假设有两个dateTime值X和Y,我需要从表中提取日期值在X和Y之间的所有行。 如果 flag 值为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函数来过滤List中的值。有关于此的任何建议吗?
感谢您的帮助。
答案 0 :(得分:0)
如果我理解正确,你实际上有2个输入参数X&amp; 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)
这会将整个事情简化为一个查询...根据数据集可能仍然效率低下。