JPA запрашивает с CriteriaBuilder IN - PullRequest
0 голосов
/ 07 февраля 2020

Я впервые пишу здесь с просьбой о помощи, и извините, если это очень глупо, но я пробовал некоторые коды, которые я нашел, но они не работают вообще.

В нашем приложении мы Мы использовали одну строку для фильтрации состояния, но новые требования должны изменить это на Список, ограничение здесь состоит в том, что мы пытаемся использовать старый метод для обратной совместимости и сделать нашу FE более легкой для интеграции с нами.

Мой вопрос в том, можно ли использовать критерий Builder.in () для фильтрации этого, используя Список?

Здесь я публикую спецификацию, которая есть в нашей BE.

    public Page<ReturnObject> findAll(final Pageable pageable, final GetRequest request) {
        final Specification<ReturnObject> specification =
                Specification.where(ReturnObjectSpecs.getFeNameSpec(request.getFeName())
                        .and(ReturnObjectSpecs.getIdSpec(request.getId()))
                        .and(ReturnObjectSpecs.getUserIdSpec(request.getUserId()))
                        .and(ReturnObjectSpecs.getStatusSpec(request.getStatus())));

        return sessionRepository.findAll(specification, pageable);
    }

Здесь идет предыдущая спецификация c для критериев Builder

    static Specification<ReturnObject> getStatusSpec(final String status){
        return (root, query, criteriaBuilder) -> StringUtils.isEmpty(status)?
                criteriaBuilder.isTrue(criteriaBuilder.literal(true)):
                criteriaBuilder.equal(root.get("status"), status);
    }

Здесь идет речь о том, что я пытался запросить этот список.

    static Specification<ReturnObject> getStatusSpec(final List<String> status) {
        return (root, query, criteriaBuilder) -> {
            if (status.isEmpty()) {
                return criteriaBuilder.isTrue(criteriaBuilder.literal(true));
            } else {
                Expression<String> expression = root.get("status");
                expression.in(status);
                return criteriaBuilder.in(expression);
            }
        };
    }

Вот фактическая модель, которую мы имеем

public class GetRequest {
    private Long id;
    private Long userId;
    private List<String> status;

    //Getters and setters are ignored 
}

Спасибо за вашу помощь

1 Ответ

0 голосов
/ 07 февраля 2020

Это должно работать правильно:

return root.get("status").in(status)

Offtopi c

criteriaBuilder.isTrue(criteriaBuilder.literal(true))

можно заменить на

criteriaBuilder.and()

как per CriteriaBuilder # и

Создать соединение из указанных предикатов ограничения. Соединение нулевых предикатов верно.

...