Можно ли использовать Date в new SearchCriteria
код класса:
@Entity
public class Player {
@Id
private Long id;
private String name;
private String title;
@Enumerated(EnumType.STRING)
private Race race;
@Enumerated(EnumType.STRING)
private Profession profession;
private Integer experience;
private Integer level;
private Integer untilNextLevel;
private Date birthday; // проблемное поле
private Boolean banned;
PlayerService
if (minExperience != null) {
playerSpecification.add(new SearchCriteria("experience", minExperience, SearchOperation.GREATER_THAN_EQUAL));
}
if (maxExperience != null) {
playerSpecification.add(new SearchCriteria("experience", maxExperience, SearchOperation.LESS_THAN_EQUAL));
}
// TODO скорректировать вызов, чтобы не возникало исключения
if (after != null) {
playerSpecification.add(new SearchCriteria("birthday", new Date(), SearchOperation.GREATER_THAN_EQUAL));
}
Получаю исключение
org.springframework.web.util.NestedServletException:
Request processing failed; nested exception is
org.springframework.dao.InvalidDataAccessApiUsageException:
Parameter value [Thu Jul 28 07:21:00 MSK 2022] did not match expected type [java.util.Date (n/a)]
Не совсем понимаю, почему оно возникает. Дело в том, что в SearchCriteria передается объект и я передаю объект Дату. То внутри происходят какие-то магические изменения и дальше он эту дату преобразует в текст, а потом пытается снова в дату. И момент повторного преобразования в дату у него этого не получается сделать.
Ответы (1 шт):
Был некорректно сформулирован вопрос. Вот мой класс
public class SearchCriteria {
private String key;
private Object value;
private SearchOperation operation;
Я изначально думал, что это какой-то класс, наследованный от интерфейса. В поле "значения фильтра" можно сохранить любой объект. Дальше экземпляры этого класса используются для построения Predicate через CriteriaBuilder И вот в том моменте был косяк Вместо этого
if (criteria.getOperation().equals(SearchOperation.GREATER_THAN)) {
predicates.add(builder.greaterThan(
root.get(criteria.getKey()), criteria.getValue().toString()));
Надо было писать так
} else if (criteria.getOperation().equals(SearchOperation.DATE_GREATER_THAN)) { // date
predicates.add(builder.greaterThan(
root.get(criteria.getKey()), new Date(Long.parseLong(criteria.getValue().toString()))));
Спасибо всем откликнувшимся.