카테고리 없음

JPA CriteriaBuilder : 결합 된 cloumn에서 IN 쿼리를 사용하는 ListJoin

기록만이살길 2021. 2. 22. 05:12
반응형

JPA CriteriaBuilder : 결합 된 cloumn에서 IN 쿼리를 사용하는 ListJoin

1. 질문(문제점):

값 목록에서 테이블을 검색해야하는 사용 사례가 있습니다. 다음은 스키마입니다.

CASE 테이블

Case_Id

CASE_CIN 테이블

Case_Id

cin

CASE & CASE_CIN 테이블은 Many to Many .

제공된 CIN 목록을 기반으로 사례를 검색해야합니다. 이것은 내가 구현하려는 SQL입니다.

select distinct c.* from case c left join case_cin cc on c.case_id = cc.case_id where cc.cin in ("cin1", "cin2", "cin3");

다음은 단일 CIN을 기반으로 필터 기준을 설계 한 방법입니다.

public static Specification<CaseEntity> buildSpecification(CaseSearchRequestDto criteria, String userName) {
    return (root, query, cb) -> {
        List<Predicate> predicates = new ArrayList<>();
    
        if (!isEmpty(criteria.getAssociatePartyCins())) {
            predicates.add(buildAssociatePartyCinsFilterPredicate(root, cb, query, criteria.getAssociatePartyCins());
        }

        return cb.and(predicates.toArray(new Predicate[0]));
    };
}

private static Predicate buildAssociatePartyCinsFilterPredicate(Root<CaseEntity> root, CriteriaBuilder cb, CriteriaQuery query, List<String> cins) {
    Predicate filterPredicate = cb.disjunction();
    
    ListJoin<CaseEntity, String> cinsJoin = root.joinList(FIELD_CASE_CINS, LEFT);
    filterPredicate.getExpressions().add(startWithString(cinsJoin, cb, **cins.get(0)**); // need to change logic here.

    query.distinct(true);
    return filterPredicate;
}

나는 또한 모든 CIN에 대해 정확히 일치하고 싶습니다 startWithString.

누구나 여러 값으로 검색 할 수 있도록 코드를 수정할 수 있습니까?

2. 해결방안:

제가 생각했던 것보다 훨씬 더 간단합니다. 조건을 cinsJoin.in(cins).

private static Predicate buildAssociatePartyCinsFilterPredicate(Root<CaseEntity> root, CriteriaBuilder cb, CriteriaQuery query, List<String> cins) {
    Predicate filterPredicate = cb.disjunction();
    
    ListJoin<CaseEntity, String> cinsJoin = root.joinList(FIELD_CASE_CINS, LEFT);
    filterPredicate.getExpressions().add(cinsJoin.in(cins));

    query.distinct(true);
    return filterPredicate;
}
65847954
반응형