SELECT特定行sql查询Java 8

时间:2017-03-06 10:51:40

标签: java sql oracle jpa jdbc

我要从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中的值。有关于此的任何建议吗?

感谢您的帮助。

1 个答案:

答案 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)

这会将整个事情简化为一个查询...根据数据集可能仍然效率低下。