2017-03-06 23 views
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函数从列表仅仅是要过滤的值。对此有何建议?

感谢您的帮助。

+0

怎么样't.flag IN(:flagValue1,:flagValue2,:flagValue3)' –

+0

数据集有多大,我们谈论在这里?数千,数百万? – Tschallacka

+1

或在WHERE子句中使用“OR”,则有1个查询。 FWIW这不是SQL,因此将变量标记为“sqlX”完全是误导性的。 –

回答

0

如果我理解正确的是你确实有2个输入参数X & Y(自/至日期AKA)。你总是想查询关于输入日期的所有标志的值。因此,像这样的查询会更有效率:

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) 

这会减少整个事情只是一个查询...依赖于数据集可能仍然是低效的。