где предложение IN - многостолбцовый (querydsl) - PullRequest
0 голосов
/ 31 января 2019

У меня есть три целочисленных значения двух пар.
Я хотел бы использовать это как список IN в предложении 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]

Я посмотрел его в официальном документе, но он не вышел.
Есть ли способ?

Спасибо.

Ответы [ 2 ]

0 голосов
/ 31 января 2019

для управления кортежем в предложении 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
      );
0 голосов
/ 31 января 2019

попробуйте

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