CriteriaBuilder API.Запрос предложения IN - PullRequest
0 голосов
/ 18 сентября 2018

Существует схема базы данных, как показано ниже.enter image description here

У меня есть коллекция Collection<String> sportCodes из codes из таблицы sport.

Я могу построить предикат ...

private Collection<String> sportCodes;

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

... и получите PlaygroundEntity с набором sport codes, включенным в коллекцию sportCodes.

Как я могу сделать это наоборот?

то есть для создания предиката, подобного этому ...

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

... и получить PlaygroundEntity с набором sport codes, который включает коллекцию sportCodes.

Буду признателен за любую помощь.

1 Ответ

0 голосов
/ 18 сентября 2018

Я потратил 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]));
}

Надеюсь, это кому-нибудь поможет.

...