Querydsl с предикатом нескольких условий для родительской и дочерней таблиц - PullRequest
0 голосов
/ 05 апреля 2020

Я использую Springboot с java 8, querydsl 4.2.1

У меня есть структура из базы данных, где таблица персон, содержащая имя, адрес, active_status. Человек может иметь несколько ky c документов со сроком действия. KY C документы находятся в таблице kyc_document.

Мне нужно получить активных людей, где их документы ky c действительны на сегодняшнюю дату.

Ниже мой код.

    QPerson qPerson = QPerson.person;
    QKycDOcument qKycDOcument = QKycDOcument.kycDOcument;
    Predicate datePredicate = JPAExpressions
                    .selectOne()
                    .from(qKycDOcument)
                    .where(qKycDOcument.fromDate.before(new Date(System.currentTimeMillis())),
                            qKycDOcument.toDate.isNull().or(qKycDOcument.toDate.after(new Date(System.currentTimeMillis())))
                    )
                    .exists();
    builder.and(qPerson.activeStatus.eq("Active").and(datePredicate)); 

Это дает мне запрос ниже -

select
        person0_.RECORD_ID as RECORD_I1_7_,
        person0_.ACTIVE_STATUS as ACTIVE_S2_7_,
        person0_.DECEASED as DECEASED3_7_,
        person0_.GENDER as GENDER4_7_,
        person0_.PROFILE_NOTES as PROFILE_5_7_,
        person0_.RECORD_TYPE as RECORD_T6_7_ 
    from
        PERSON person0_ 
    where
        person0_.ACTIVE_STATUS=? 
        and (
            exists (
                select
                    1 
                from
                    KYC_DOCUMENT kycdoc1_ 
                where
                    kycdoc1_.FROM_DATE<? 
                    and (
                        kycdoc1_.TO_DATE is null 
                        or kycdoc1_.TO_DATE>?
                    )
            )
        ) 
    order by
        person0_.RECORD_ID desc

мой ожидаемый запрос:

select
        person0_.RECORD_ID as RECORD_I1_7_,
        person0_.ACTIVE_STATUS as ACTIVE_S2_7_,
        person0_.DECEASED as DECEASED3_7_,
        person0_.GENDER as GENDER4_7_,
        person0_.PROFILE_NOTES as PROFILE_5_7_,
        person0_.RECORD_TYPE as RECORD_T6_7_ 
    from
        PERSON person0_ 
    where
        person0_.ACTIVE_STATUS=? 
        and (
            exists (
                select
                    1 
                from
                    KYC_DOCUMENT kycdoc1_ 
                where
                    person0_.RECORD_ID = kycdoc1_.RECORD_ID
                    and kycdoc1_.FROM_DATE<? 
                    and (
                        kycdoc1_.TO_DATE is null 
                        or kycdoc1_.TO_DATE>?
                    )
            )
        ) 
    order by
        person0_.RECORD_ID desc

person0_.RECORD_ID = kycdoc1_.RECORD_ID is дополнительное условие во внутреннем запросе, которое является требованием и не выполнено.

Пожалуйста, предложите, что должно быть в моем построителе предикатов.

Спасибо за предложения, поступающие ...

...