Что-то пошло не так с этим кодом. Я пытаюсь создать собственный запрос, но всегда получаю одну и ту же ошибку.
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] ...
Я хочу фильтровать фотографии по теме, но я также хочу добавить некоторые другие фильтры. Вот почему я хотел бы создать собственный запрос, в котором я добавлю некоторые предикаты перед выполнением запроса.
Что такое listThemes?
На самом деле это был мой ArrayList. я отредактирую свой пост




IN оператор проверяет, находится ли столбец в списке значений, предоставленных параметрами запроса. Для проверки наличия значения в коллекции используйте MEMBER OF
Подробнее https://www.objectdb.com/java/jpa/query/jpql/collection#Criteria_Query_Collection_Expressions_
В моем коде есть только одна тема, но я могу найти одну или несколько тем.
Тем не менее вы хотите найти его в коллекции, а не в списке значений.
что он должен делать?