选择特定行sql查询Java 8

选择特定行sql查询Java 8,java,sql,oracle,jpa,jdbc,Java,Sql,Oracle,Jpa,Jdbc,我必须从Oracle数据库中提取一些特定的数据。我正在使用Java8。 我必须从表中考虑3列:FraseDATEY1DATEY2。 该标志可以有值1、2或3(标志值在一段时间内或基于某些事件从1->2->3更新) 对于两个日期时间值X和Y,我需要从表中提取日期值在X和Y之间的所有行。 如果标志值为1或2,则日期_1必须介于X和Y之间,而与日期_2无关。但如果标志值为3,则日期2必须介于X和Y之间,而与日期1无关 为此,我创建了三个具有不同参数的不同查询,如flag=1/flag=2/flag=3

我必须从Oracle数据库中提取一些特定的数据。我正在使用Java8。 我必须从表中考虑3列:FraseDATEY1DATEY2。 该标志可以有值1、2或3(标志值在一段时间内或基于某些事件从1->2->3更新)

对于两个日期时间值X和Y,我需要从表中提取日期值在X和Y之间的所有行。 如果标志值为1或2,则日期_1必须介于X和Y之间,而与日期_2无关。但如果标志值为3,则日期2必须介于X和Y之间,而与日期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;
String sql1=“选择新的xxxx.xxxx.xxx.Java.class.xxx(”
+t.标志,t.日期,t.日期
+“来自表t”
+“其中t.flag=:flagValue1”
+“和t.date_1>=:X”
+“和t.date_1<:Y”;
String sql2=“选择新的xxxx.xxxx.xxx.Java.class.xxx(”
+t.标志,t.日期,t.日期
+“来自表t”
+“其中t.flag=:flagValue2”
+“和t.date_1>=:X”
+“和t.date_1<:Y”;
String sql3=“选择新的xxxx.xxxx.xxx.Java.class.xxx(”
+t.标志,t.日期,t.日期
+“来自表t”
+“其中t.flag=:flagValue3”
+“和t.date_2>=:X”
+“和t.date_2<:Y”;
List list1=this.entityManger.createQuery(sql1,model.class)
.setParameter(“1”,标志1)
.setParameter(“X”,firstDateValue)
.setParameter(“Y”,第二个日期值)
.getResultList();
List list2=this.entityManger.createQuery(sql2,model.class)
.setParameter(“2”,标志2)
.setParameter(“X”,firstDateValue)
.setParameter(“Y”,第二个日期值)
.getResultList();
List list3=this.entityManger.createQuery(sql3,model.class)
.setParameter(“3”,标志3)
.setParameter(“X”,firstDateValue)
.setParameter(“Y”,第二个日期值)
.getResultList();
List finalList=new ArrayList();
finalList.addAll(列表1);
finalList.addAll(列表2);
finalList.addAll(列表3);
回归终结者;
还有别的方法吗?对于这个问题,哪种(单一)查询更好

PS:我想知道是否可以使用Java8的Lambda函数来过滤列表中的值。有什么建议吗


谢谢您的帮助。

如果我理解正确,您实际上有两个输入参数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)
从表t中选择新的Java.class.name(t.flag,t.date_1,t.date_2)
哪里
(t.flag in(1,2)和t.date_1>=:X和t.date_1<:Y)
或
(t.flag=3和t.date_1 2=:X和t.date_2<:Y)

这将把整个问题简化为一个查询。。。可能仍然效率低下,具体取决于数据集。

关于(:flagValue1,:flagValue2,:flagValue3)中的
t.flag如何?
我们在这里讨论的数据集有多大?数千,数百万?或在WHERE子句中使用“或”,则有1个查询。FWIW这不是SQL,所以将变量标记为“sqlX”是完全误导的。