CriteriaBuilder API。 IN子句查询

问题描述 投票:0回答:1

有一个数据库模式,如下所示。 enter image description here

我从Collection<String> sportCodes表中收集了codessport

我可以建立一个谓词......

private Collection<String> sportCodes;

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

...并获得PlaygroundEntitysport codes系列中包含的一组sportCodes

我怎么能这样做呢?

即建立这样的谓词......

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

...并获得PlaygroundEntity与一套sport codes,其中包括sportCodes系列。

我很感激任何帮助。

java jpa jpa-2.0 criteria criteria-api
1个回答
0
投票

我在这个问题上花了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]));
}

希望它可以帮助某人。

© www.soinside.com 2019 - 2024. All rights reserved.