Предикат CriteriaBuilder IN

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

public class Photo {
    @Id 
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private Long photoId;
    private String title;


    @ManyToMany
    @JoinTable(name = "PHOTO_THEME",
            joinColumns=@JoinColumn(name = "PHOTO_FK"),
            inverseJoinColumns=@JoinColumn(name = "THEME_FK"),
            uniqueConstraints=@UniqueConstraint(columnNames= {"PHOTO_FK", "THEME_FK"}))
    @JsonManagedReference
    private List<Theme> themes;

}

Здесь мой класс Тема

 public class Theme {

        @Id
        @GeneratedValue(strategy=GenerationType.IDENTITY)
        private Long themeId;

        @Lob
        @Column(length=1000000)
        private String description;

        @JsonBackReference
        @ManyToMany(mappedBy = "themes")
        private List<Photo> photos;


        @Override
        public String toString() {
            return "Theme [themeId = " + themeId + "]";
        }


    }

Мой репозиторий

    public interface IPhotoRepository extends JpaRepository<Photo, Long>, 
                      JpaSpecificationExecutor<Photo>{
}

Мой сервис

@Service
public class PhotoServiceImpl implements IPhotoService {
    @Autowired
    private IPhotoRepository photoRepository;
    @Autowired
    private ThemeServiceImpl themeService;


    @Override
    public List<Photo> findByCriteria(PhotoFilters filter) {
        return this.photoRepository.findAll(new Specification<Photo>() {

            @Override
            public Predicate toPredicate(Root<Photo> root, CriteriaQuery<?> query, CriteriaBuilder criteriaBuilder) {
                List<Predicate> predicates = new ArrayList<>();


                if (filter.getTheme() != null && filter.getTheme() != "") {

                    Theme themex2 = themeService.findByType("Retro");
                    List<Theme> listThemes = new ArrayList<Theme>();
                    listThemes.add(themex2);

                    In<Theme> predicate = criteriaBuilder.in(root.get("themes"));

                    listThemes.forEach(t -> predicate.value(t));

                    predicates.add(predicate);
                }
                return criteriaBuilder.and(predicates.toArray(new Predicate[predicates.size()]));
            }
        });
    }

}

И это ОШИБКА:

java.lang.IllegalArgumentException: Parameter value [Theme [themeId=1]] did not match expected type [java.util.Collection (n/a)] at org.hibernate.query.spi.QueryParameterBindingValidator.validate(QueryParameterBindingValidator.java:54) ~[hibernate-core-5.4.1.Final.jar:5.4.1.Final] ...

что он должен делать?

coder Tester 13.03.2019 17:46

Я хочу фильтровать фотографии по теме, но я также хочу добавить некоторые другие фильтры. Вот почему я хотел бы создать собственный запрос, в котором я добавлю некоторые предикаты перед выполнением запроса.

el3gans 13.03.2019 18:02

Что такое listThemes?

Lukas Eder 13.03.2019 20:10

На самом деле это был мой ArrayList. я отредактирую свой пост

el3gans 13.03.2019 21:41
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
4
884
1

Ответы 1

IN оператор проверяет, находится ли столбец в списке значений, предоставленных параметрами запроса. Для проверки наличия значения в коллекции используйте MEMBER OF

Подробнее https://www.objectdb.com/java/jpa/query/jpql/collection#Criteria_Query_Collection_Expressions_

В моем коде есть только одна тема, но я могу найти одну или несколько тем.

el3gans 14.03.2019 09:44

Тем не менее вы хотите найти его в коллекции, а не в списке значений.

Peter Šály 14.03.2019 13:08

Другие вопросы по теме