Возникает ошибка преобразования при использовании API критериев с пользовательским типом. Ошибка выглядит следующим образом:
java .lang.IllegalArgumentException: не известно, как преобразовать значение [100.00: br.mrv.currency.MoneyImpl] в запрошенный тип [br.mrv.currency.Money ]
Я в замешательстве, потому что класс MoneyImpl является классом Money. Чтобы уточнить, это то, что я реализовал:
Абстрактный класс, используемый для обработки значений валюты:
public abstract class Money extends Number {
}
Реализация денег:
class MoneyImpl extends Money {
// Number methods implementation
@Override
public int intValue() {
// implementation
}
@Override
public long longValue() {
// implementation
}
@Override
public float floatValue() {
// implementation
}
@Override
public double doubleValue() {
// implementation
}
}
Атрибут-собеседник, использовать класс Money в слое persistense:
@Converter
public class MoneyAttributeConverter implements AttributeConverter<Money, Double> {
@Override
public Double convertToDatabaseColumn(Money money) {
if (Objects.isNull(money) || money.isNull()) {
return null;
}
return money.toDouble();
}
@Override
public Money convertToEntityAttribute(Double value) {
if (Objects.isNull(value)) {
return Money.NULL;
}
return Money.from(value);
}
}
Сущность Employee со свойством заработной платы Money:
@Entity
public class Employee {
@Convert(converter = MoneyAttributeConverter.class)
private Money salary;
// (...)
}
Наконец, спецификация выбирает сотрудников с зарплатой, превышающей некоторое значение :
public class SalaryGreaterThan extends Specification<Employee> {
private Money value;
public SalaryGreaterThan(Money value) {
this.value = value;
}
@Override
public Predicate toPredicate(Root<Employee> root, CriteriaQuery<?> query, CriteriaBuilder builder) {
return builder.gt(root.get("salary"), value);
}
}
Я что-то упустил? Нужно ли использовать другой тип собеседника?