Java 联合子选择查询

Java 联合子选择查询,java,sql,oracle,union,querydsl,Java,Sql,Oracle,Union,Querydsl,我需要优化一个动态查询。这是一个例子,但它有更多的过滤器(布尔表达式) 我在SQL中将此选择优化为1s,结果如下: SELECT * FROM table WHERE id IN ( (SELECT id FROM table WHERE field1= 'string1' AND field2='string2' AND field3=0) UNION (SELECT id FROM table WHERE field1= 'string2' AND field2='stri

我需要优化一个动态查询。这是一个例子,但它有更多的过滤器(布尔表达式)

我在SQL中将此选择优化为1s,结果如下:

SELECT * FROM table WHERE

  id IN ( (SELECT id FROM table WHERE field1= 'string1'  AND field2='string2'  AND field3=0)

  UNION (SELECT id FROM table WHERE field1= 'string2'  AND field2='string1'  AND field3=1 ) )

  AND field4 in (1,2,3,4,5,...)  AND field5 > =SYSDATE-365

  ORDER BY  field5 DESC,  id DESC
但在QueryDsl没有得到改善。我这样做是因为工会不起作用

BooleanExpression psubq1 = qtable .field1.eq(string1).and(qtable .field2.eq(string2)).and(qtable .field3.eq(Boolean.FALSE));

BooleanExpression psubq2 = qtable .field1.eq(string2).and(qtable .field2.eq(string1)).and(qtable .field3.eq(Boolean.TRUE));

Expression<?>[] args = { qtable .id};

List<Long> resultids = tableRepository.findAllIds(psubq1, args);

resultids.addAll(tableRepository.findAllIds(psubq2, args));

pSubQuery = qtable .id.in(resultids).and(pSubQueryFilter);
BooleanExpression psubq1=qtable.field1.eq(string1)和(qtable.field2.eq(string2))和(qtable.field3.eq(Boolean.FALSE));
布尔表达式psubq2=qtable.field1.eq(string2)和(qtable.field2.eq(string1))和(qtable.field3.eq(Boolean.TRUE));
表达式[]args={qtable.id};
List resultitds=tableRepository.findAllIds(psubq1,args);
addAll(tableRepository.findAllIds(psubq2,args));
pSubQuery=qtable.id.in(resultids.)和(pSubQueryFilter);
是否存在通过一次对DB的调用使用Querydsl执行最后一个sql的方法


谢谢

com.querydsl.sql.SQLExpressions
中有一个静态方法
union
来执行此操作。As参数使用通过
SQLExpressions::select创建的子查询

import com.querydsl.core.types.dsl.*;
import com.querydsl.sql.DatePart;
import com.querydsl.sql.SQLExpressions;
import com.querydsl.sql.oracle.OracleGrammar;
import com.querydsl.sql.oracle.OracleQuery;
...
OracleQuery query = new OracleQuery<>(con);
query.select(table).from(table).where(
    table.id.in(
        SQLExpressions.union(
            SQLExpressions.select(table.id).from(table)
                .where(table.field1.eq("string1")
                    .and(table.field2.eq("string2"))
                    .and(table.field3.eq(Expressions.FALSE))),
            SQLExpressions.select(table.id)
                .from(table)
                .where(table.field1.eq("string2")
                    .and(table.field2.eq("string1"))
                    .and(table.field3.eq(Expressions.TRUE))))
    )
    .and(table.field4.in(1,2,3,4,5))
    .and(table.field5.goe(
        SQLExpressions.dateadd(DatePart.day, OracleGrammar.sysdate, -365))))
.orderBy(table.field5.desc(), table.id.desc());;
导入com.querydsl.core.types.dsl.*;
导入com.querydsl.sql.DatePart;
导入com.querydsl.sql.SQLExpressions;
导入com.querydsl.sql.oracle.oraclegram;
导入com.querydsl.sql.oracle.OracleQuery;
...
OracleQuery=新的OracleQuery(con);
查询。选择(表)。从(表)。其中(
表1.id.in(
SQLExpressions.union(
SQLExpressions.select(table.id).from(table)
.式中(表1.eq(“string1”)
和(表2.eq(“string2”))
和(表.field3.eq(表达式.FALSE)),
SQLExpressions.select(table.id)
.来自(表)
.式中(表1.eq(“string2”)
和(表2.eq(“string1”))
和(表.field3.eq(Expressions.TRUE)))
)
和(表4.in(1,2,3,4,5))
.和(表5.goe)(
dateadd(DatePart.day,oraclegramarm.sysdate,-365)))
.orderBy(table.field5.desc(),table.id.desc());;
BooleanExpression psubq1 = qtable .field1.eq(string1).and(qtable .field2.eq(string2)).and(qtable .field3.eq(Boolean.FALSE));

BooleanExpression psubq2 = qtable .field1.eq(string2).and(qtable .field2.eq(string1)).and(qtable .field3.eq(Boolean.TRUE));

Expression<?>[] args = { qtable .id};

List<Long> resultids = tableRepository.findAllIds(psubq1, args);

resultids.addAll(tableRepository.findAllIds(psubq2, args));

pSubQuery = qtable .id.in(resultids).and(pSubQueryFilter);
import com.querydsl.core.types.dsl.*;
import com.querydsl.sql.DatePart;
import com.querydsl.sql.SQLExpressions;
import com.querydsl.sql.oracle.OracleGrammar;
import com.querydsl.sql.oracle.OracleQuery;
...
OracleQuery query = new OracleQuery<>(con);
query.select(table).from(table).where(
    table.id.in(
        SQLExpressions.union(
            SQLExpressions.select(table.id).from(table)
                .where(table.field1.eq("string1")
                    .and(table.field2.eq("string2"))
                    .and(table.field3.eq(Expressions.FALSE))),
            SQLExpressions.select(table.id)
                .from(table)
                .where(table.field1.eq("string2")
                    .and(table.field2.eq("string1"))
                    .and(table.field3.eq(Expressions.TRUE))))
    )
    .and(table.field4.in(1,2,3,4,5))
    .and(table.field5.goe(
        SQLExpressions.dateadd(DatePart.day, OracleGrammar.sysdate, -365))))
.orderBy(table.field5.desc(), table.id.desc());;