Как добавить проверку для объекта списка в предикате Java

#java #spring #spring-boot #predicate #specifications

#java #spring #spring-boot #предикат #технические характеристики

Вопрос:

У меня есть одна пользовательская сущность, в которой у меня есть список ролей, теперь я хочу получить список пользователей по определенному списку пользователя, используя спецификацию Java и предикат. Кто-нибудь может мне помочь? Для справки ниже приведен код snnipet.

 public List<Users> findByPagingCriteria(SearchModel searchModel, Pageable pageable) {
        Page page = userRepository.findAll(new Specification<Users>() {

            @Override
            public Predicate toPredicate(Root<Users> root, javax.persistence.criteria.CriteriaQuery<?> query,
                    CriteriaBuilder cb) {
                List<Predicate> predicates = new ArrayList<>();
                if (searchModel.getName() != null) {
                    predicates.add(cb.or(cb.like(root.get("firstName"), "%"   searchModel.getName()   "%"),
                            cb.like(root.get("lastName"), "%"   searchModel.getName()   "%")));
                }
                if (searchModel.getId() != null) {
                    predicates
                            .add(cb.and(cb.equal(root.get("adminDetails").get("adminUniqueId"), searchModel.getId())));
                }
                if (searchModel.getRole() != null amp;amp; searchModel.getRole().equalsIgnoreCase("admin")) {
                    List<Role> roles = Arrays.asList(Role.builder().name("ROLE_ADMIN").build());

                    predicates.add(cb.and(cb.equal(root.get("roles"), roles)));
                }
                return cb.and(predicates.toArray(new Predicate[predicates.size()]));
            }
        }, pageable);

        page.getTotalElements(); // get total elements
        page.getTotalPages(); // get total pages
        return page.getContent(); // get List of Employee
    }
 

Проверьте раздел ролей, в котором я передал список ролей АДМИНИСТРАТОРА. Но во время запуска он выдает мне сообщение об ошибке,

java.sql.SQLException: для параметра 4 не указано значение

Комментарии:

1. Не уверен, что это проблема, но я бы не стал использовать cb.equal(root.get("roles"), roles)) для сравнения коллекций. Вам лучше использовать cb.isMember .

2. Ошибка @HopeyOne Now не выдается, но из базы данных не поступает никаких записей. Есть идеи?

3. Вы можете [войти] ( baeldung.com/sql-logging-spring-boot ) ваши SQL-запросы, сгенерированные spring-boot-data с spring.jpa.show-sql=true помощью свойства. Затем вы можете попытаться отладить запрос к вашему базовому источнику данных.