简体   繁体   English

Java JPA CriteriaBuilder或Expression无法正常工作

[英]Java JPA CriteriaBuilder OR Expression does not work correctly

This is my method: 这是我的方法:

CriteriaBuilder builder = entityManager.getCriteriaBuilder();
CriteriaQuery<EmployersList> criteriaQuery = builder.createQuery(EmployersList.class);
Root<EmployersList> root = criteriaQuery.from(EmployersList.class);

Expression<String> orgPhoneNumberExp = root.get("orgphoneNumber");
Predicate orgPhoneNumberPredicate = orgPhoneNumberExp.in(phoneNumber);

Expression<String> accPhoneNumberExp = root.get("accphoneNumber");
Predicate accPhoneNumberPredicate = accPhoneNumberExp.in(phoneNumber);

Expression<String> orgStatusExp = root.get("orgphoneStatus");
Predicate orgStatusExpPredicate = builder.upper(orgStatusExp).in("SUSPECT", "FRAUD", "NEGATIVE");

Expression<String> accPhoneStatusExp = root.get("accphoneStatus");
Predicate accPhoneStatuPredicate = builder.upper(accPhoneStatusExp).in("SUSPECT", "FRAUD", "NEGATIVE");

Expression<Date> orgPhoneStatusExpDateExmp = root.get("orgphoneStatusExpdate");

Expression<Date> accPhoneStatusExpDateExmp = root.get("accphoneStatusExpdate");

Predicate orgPhoneStatusExpDatePredicate = builder.or(builder.greaterThanOrEqualTo(orgPhoneStatusExpDateExmp, new Date()), builder.isNull(orgPhoneStatusExpDateExmp));

Predicate accPhoneStatusExpDatePredicate = builder.or(builder.greaterThanOrEqualTo(accPhoneStatusExpDateExmp, new Date()), builder.isNull(accPhoneStatusExpDateExmp));

Expression<Boolean> orgExp = builder.and(orgPhoneNumberPredicate, builder.and(orgStatusExpPredicate, orgPhoneStatusExpDatePredicate)).as(Boolean.class);

Expression<Boolean> accExp = builder.and(accPhoneNumberPredicate, builder.and(accPhoneStatuPredicate, accPhoneStatusExpDatePredicate)).as(Boolean.class);

criteriaQuery.where(builder.or(orgExp, accExp));

List<EmployersList> result = entityManager.createQuery(criteriaQuery).getResultList();

So, i need check 'org' Phones and 'acc' Phones in DB. 因此,我需要在数据库中检查“ org”电话和“ acc”电话。 I need check...(if orgphoneNumber IN(list of phone numbers which i will get in method parametr) and if orgStatusExp - SUSPECT or FRAUD or NEGATIVE and orgPhoneStatusExpDateExmp >= curdate or null) otherwise ... i need to check same things for 'acc' Phones 我需要检查...(如果orgphoneNumber IN(我将在方法参数中获得的电话号码列表),以及orgStatusExp-SUSPECT或FRAUD或NEGATIVE和orgPhoneStatusExpDateExmp> = curdate或null),否则...我需要检查相同的东西适用于“ acc”电话

with this code i get Select with WHERE: 有了这个代码,我在哪里选择:

where
    (
        employersl0_.ORGPHONE_NUMBER in (
            ?
        )
    ) 
    and (
        upper(employersl0_.ORGPHONE_STATUS) in (
            ? , ? , ?
        )
    ) 
    and (
        employersl0_.ORGPHONE_STATUS_EXPDATE>=? 
        or employersl0_.ORGPHONE_STATUS_EXPDATE is null
    ) 
    or (
        employersl0_.ACCPHONE_NUMBER in (
            ?
        )
    ) 
    and (
        upper(employersl0_.ACCPHONE_STATUS) in (
            ? , ? , ?
        )
    ) 
    and (
        employersl0_.ACCPHONE_STATUS_EXPDATE>=? 
        or employersl0_.ACCPHONE_STATUS_EXPDATE is null
    )

but i want to get something like this: 但我想得到这样的东西:

    where
    (
        employersl0_.ORGPHONE_NUMBER in (
            ?
        )
        and (
                upper(employersl0_.ORGPHONE_STATUS) in (
                ? , ? , ?
                )
            ) 
        and (
            employersl0_.ORGPHONE_STATUS_EXPDATE>=? 
            or employersl0_.ORGPHONE_STATUS_EXPDATE is null
        ) 
    ) 

    or (
        employersl0_.ACCPHONE_NUMBER in (
            ?
        )
        and (
            upper(employersl0_.ACCPHONE_STATUS) in (
                ? , ? , ?
            )
        ) 
        and (
            employersl0_.ACCPHONE_STATUS_EXPDATE>=? 
            or employersl0_.ACCPHONE_STATUS_EXPDATE is null
        )
    )

Can you help me with this issue?:) 您能帮我解决这个问题吗?

For this case you most define 3 Predicate. 对于这种情况,您最多定义3个谓词。
pridicate a do and on ORGPHONE_NUMBER, ORGPHONE_STATUS and ORGPHONE_STATUS_EXPDATE. 并以ORGPHONE_NUMBER,ORGPHONE_STATUS和ORGPHONE_STATUS_EXPDATE为准。
pridicate b do and on ACCPHONE_NUMBER, ACCPHONE_STATUS and ACCPHONE_STATUS_EXPDATE. b做和在ACCPHONE_NUMBER,ACCPHONE_STATUS和ACCPHONE_STATUS_EXPDATE上执行。
pridicate c do or on pridcate a and b. do c do或on rid a和b。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM