【问题标题】:JPA CriteriaBuilder: ListJoin with IN query on joined cloumnJPA CriteriaBuilder:在连接列上使用 IN 查询列出连接
【发布时间】:2021-04-27 02:02:53
【问题描述】:

我有一个用例,我需要在值列表中搜索表。下面是架构:

CASE 表

Case_Id

CASE_CIN 表

Case_Id

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

谁能帮助修改代码以允许按多个值进行搜索?

【问题讨论】:

    标签: java spring spring-data-jpa criteria-api


    【解决方案1】:

    事实证明它比我想象的要简单得多。只需要将条件替换为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;
    }
    

    【讨论】:

      猜你喜欢
      • 2017-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-06
      • 2012-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多