【问题标题】:SELECT specific rows sql query Java 8选择特定行 sql 查询 Java 8
【发布时间】: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”是完全误导性的。

标签: java sql oracle jpa jdbc


【解决方案1】:

如果我理解正确,您实际上有 2 个输入参数 X 和 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)

这会将整个事情简化为一个查询……根据数据集的不同,这可能仍然是低效的。

【讨论】:

    猜你喜欢
    • 2011-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-10
    • 2012-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多