Mysql where IN子句-多列(querydsl)

Mysql where IN子句-多列(querydsl),mysql,sql,querydsl,in-clause,Mysql,Sql,Querydsl,In Clause,我有三个两对的整数值。 我想用它作为WHERE子句中的一个列表 (2019,5)(2019,6)(2019,7) 我想在如下查询中使用上述两对列表: SELECT * FROM WEEK_REPORT A WHERE A.user_id IN ('test2','test5' ) AND (A.year, A.week_no) IN ((2019,4),(2019,5),(2019,6)); 为此,我写了如下来源: // lastYear=2019, lastW

我有三个两对的整数值。
我想用它作为WHERE子句中的一个列表

(2019,5)(2019,6)(2019,7)

我想在如下查询中使用上述两对列表:

SELECT
    *
FROM
    WEEK_REPORT A
WHERE
    A.user_id IN ('test2','test5' ) AND
    (A.year, A.week_no) IN ((2019,4),(2019,5),(2019,6));
为此,我写了如下来源:

// lastYear=2019, lastWeekNo=4
Tuple t = JPAExpressions.select(Expressions.constant(lastYear), Expressions.constant(lastWeekNo))
    .from(weekReport)
    .fetchOne();

// currentYear=2019, currentWeekNo=5        
Tuple t2 = JPAExpressions.select(Expressions.constant(currentYear), Expressions.constant(currentWeekNo))
    .from(weekReport)
    .fetchOne();

// nextYear=2019, nextWeekNo=4
Tuple t3 = JPAExpressions.select(Expressions.constant(nextYear), Expressions.constant(nextWeekNo))
    .from(weekReport)
    .fetchOne();

return queryFactory
    .select(weekReport)
    .from(weekReport)
    .where(weekReport.user.eq(user)
        .and(Expressions.list(weekReport.year, weekReport.weekNo).in(t, t2, t3)))
    .fetch();
但是,不会输出正确的结果,并且会发生错误

java.lang.UnsupportedOperationException: null
    at com.querydsl.jpa.JPASubQuery.fetchOne(JPASubQuery.java:66) ~[querydsl-jpa-4.1.4.jar:na]
我在官方文件中查过,但没有出来。
有办法吗

谢谢。

试试这个

SELECT
    *
FROM
    WEEK_REPORT A
WHERE
    A.user_id IN ('test2','test5' ) AND
    concat(A.year, A.week_no) IN (20194,20195,20196);

要管理in子句中的元组,可以将子查询与union all一起使用 对于元组,可以将子查询与union all一起使用

SELECT
    *
FROM
    WEEK_REPORT A
WHERE
    A.user_id IN ('test2','test5' ) AND
    (A.year, A.week_no) IN ( 
      select year, month from (
        select 2019 year, 4 week from dual
        union all
        select 2019 , 5 from dual
        union all
        select 2019 , 6 from dual ) t
      );

如何将元组列表作为一个参数传递

List<Tuple> params = ...


return queryFactory
    .select(weekReport)
    .from(weekReport)
    .where(weekReport.user.eq(user)
        .and(Expressions.list(weekReport.year, weekReport.weekNo).in(params)))
    .fetch();
列表参数=。。。
返回查询工厂
.选择(weekReport)
.从(weekReport)
.where(weekReport.user.eq(用户)
.和(Expressions.list(weekReport.year,weekReport.weekNo).in(params)))
.fetch();

事实上,我想知道如何将In子句中的多个列表示为querydsl而不是本机sql。有一百种不同的软件包试图“帮助”用户使用sql。大多数人都无法在没有“原生SQL”的情况下完成所有事情。(我不能代表querydsl发言。)您可以将查询重写为
和((A.year=2019和A.week\u no=4)或(A.year=2019和A.week\u no=5)或…
什么版本的MySQL?“行构造函数”在5.7.3版本之前优化得很差。