값 목록에서 테이블을 검색해야하는 사용 사례가 있습니다. 다음은 스키마입니다.
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.
누구나 여러 값으로 검색 할 수 있도록 코드를 수정할 수 있습니까?