InvalidDataAccessApiUsageException: значение параметра [...] не соответствует ожидаемому типу [java.util.UUID (н/д)]JAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 InvalidDataAccessApiUsageException: значение параметра [...] не соответствует ожидаемому типу [java.util.UUID (н/д)]

Сообщение Anonymous »

Я использую Criteria API для создания именованных запросов с использованием фильтров. Он работает при обычном сравнении строк, но при фильтрации по UUID выдает следующую ошибку:

Код: Выделить всё

org.springframework.dao.InvalidDataAccessApiUsageException: Parameter value [67279329-5096-4196-9E73-748B33122CE2] did not match expected type [java.util.UUID (n/a)]; nested exception is java.lang.IllegalArgumentException: Parameter value [67279329-5096-4196-9E73-748B33122CE2] did not match expected type [java.util.UUID (n/a)]
Есть несколько вопросов по этой проблеме, но ни один из них не помог. Я попробовал следующее:
  • добавление @Column(name = "id", updatable = false, nullable = false) в поле сущности
  • добавление @Type(type="org) .hibernate.type.UUIDCharType") для объекта поле
  • добавление @Type(type="uuid-char") в поле сущности
Сущность Foo:

Код: Выделить всё

@Entity
//lombok stuff
public class Foo {

@Id
private UUID id;
private String name;
//...
}
Вариант SQL:

Код: Выделить всё

CREATE TABLE foo
(
id                    UUID    NOT NULL PRIMARY KEY,
name                  VARCHAR NOT NULL,
...
);
FooController:

Код: Выделить всё

@GetMapping(value = "/foo")
public ResponseEntity findFoos(@RequestParam Map filterArguments) {
FooFilter filter = filterMapper.map(filterArguments);
FooSpecification spec = new FooSpecification(filter);

List foos = fooRepo.findAll(spec);
//...
}
FooSpecification:

Код: Выделить всё

public class FooSpecification extends SpecificationHelper implements Specification {
private final FooFilter filter;

public FooSpecification(FooFilter filter) {
this.filter = filter;
}

@Override
public Predicate toPredicate(Root root, CriteriaQuery query, CriteriaBuilder criteriaBuilder) {
Predicate predicate = null;

predicate = createIdPredicate(root, filter, criteriaBuilder, predicate);
predicate = createNamePredicate(root, filter, criteriaBuilder, predicate);
// ...

return predicate;
}

private Predicate createIdPredicate(Root foo, FooFilter filter, CriteriaBuilder cb, Predicate predicate) {
Predicate returnPredicate = predicate;
if (StringUtils.isNotBlank(filter.getId()))
returnPredicate = addAndPredicate(cb, predicate, cb.like(cb.upper(foo.get("id")), "%" + filter.getId().toUpperCase() + "%"));
return returnPredicate;
}

private Predicate createNamePredicate(Root foo, FooFilter filter, CriteriaBuilder cb, Predicate predicate) {
Predicate returnPredicate = predicate;
if (StringUtils.isNotBlank(filter.getName()))
returnPredicate = addAndPredicate(cb, predicate, cb.like(cb.upper(foo.get("name")), "%" + filter.getName().toUpperCase() + "%"));
return returnPredicate;
}
}

Код: Выделить всё

addAndPredicate
 — это простой вспомогательный метод, который просто использует критерииBuilder.and(predicate,newPredicate)

Код: Выделить всё

FooFilter
имеет только строковые поля

Подробнее здесь: https://stackoverflow.com/questions/606 ... h-expected
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «JAVA»