【发布时间】:2017-07-26 05:00:12
【问题描述】:
我必须从 Oracle DB 中提取一些特定数据。我正在使用 Java 8。 我必须考虑 TABLE 中的 3 列:日期_1 |日期_2。 flag 可以具有值 1,2 或 3(flag 值在一段时间内或基于某些事件从 1->2->3 更新)。
假设两个日期时间值 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 函数来过滤列表中的值。对此有何建议?
感谢您的帮助。
【问题讨论】:
-
t.flag IN ( :flagValue1, :flagValue2 , :flagValue3)怎么样 -
我们在这里讨论的数据集有多大?数千,数百万?
-
或在 WHERE 子句中使用“OR”,则有 1 个查询。 FWIW 这不是 SQL,因此将变量标记为“sqlX”是完全误导性的。