标准生成器 API。 IN 子句查询

CriteriaBuilder API. IN clause query

有一个数据库架构,如下所示。

我从 sport table.

收集了 Collection<String> sportCodescodes

我可以建立谓词...

private Collection<String> sportCodes;

private Predicate searchBySportsPredicate(Root<PlaygroundEntity> root) {
    return root.join(PlaygroundEntity_.specializations).get(SportEntity_.code).in(sportCodes);
}

...并得到 PlaygroundEntity 和集合 sportCodes 中包含的一组 sport codes

反之亦然如何?

即像这样构建谓词...

(sportCodes).in(root.join(PlaygroundEntity_.specializations).get(SportEntity_.code))

...并获得 PlaygroundEntity 和一组 sport codes,其中包括集合 sportCodes

如有任何帮助,我将不胜感激。

这个问题我花了3天的时间,解决的太简单了:

private Predicate searchBySportsPredicate(Root<PlaygroundEntity> root, CriteriaBuilder cb) {
    Collection<Predicate> predicates = new ArrayList<>();
    for (String sportCode : sportCodes) {
        predicates.add(
                cb.equal(root.join(PlaygroundEntity_.specializations).get(SportEntity_.code), sportCode)
        );
    }
    return cb.and(predicates.toArray(new Predicate[0]));
}

重要

无效:

private Predicate searchBySportsPredicate(Root<PlaygroundEntity> root, CriteriaBuilder cb) {
    List<Predicate> predicates = new ArrayList<>(sportCodes.size());
    Path<String> codePath = root.join(PlaygroundEntity_.specializations).get(SportEntity_.code)
    for (String sportCode : sportCodes) {
        predicates.add(cb.equal(codePath, sportCode));
    }
    return cb.and(predicates.toArray(new Predicate[0]));
}

希望对大家有所帮助。