Проблема: Собственные запросы с датами возврата Spring Data возвращают java.sql.Date, а не java.time.LocalDate, несмотря на настройку.
Контекст: новый проект с Spring Boot 2.0.0.M5 (последний), Hibernate 5.2.11, Hibernate-Java8 5.2.12 (который обеспечивает поддержку классов JSR310, пока он находится в пути к классам).
Анонимизированный пример ниже (приложение не совсем о днях рождения):
public interface BirthdayRepository<T, ID extends Serializable> extends Repository<T, ID> {
@Query(value = "select day from birthdays", nativeQuery = true)
Iterable<java.sql.Date> getBirthdays(); //the return type should ideally be java.time.LocalDate
}
В базе данных (SQL Server) поле дня — это DATE, а значения — 2017-10-24.
Проблема в том, что во время выполнения репозиторий данных Spring (чью реализацию я не могу контролировать или есть способ?) возвращает java.sql.Date
, а не java.time.LocalDate
(Пояснение: тип возвращаемого значения выглядит будет решаться Spring Data и останется java.sql.Date
, даже если я изменю тип возвращаемого значения на java.time.LocalDate
, как я и начал).
Есть ли способ получить LocalDate
напрямую? Я могу преобразовать его позже, но (1) это неэффективно и (2) методы репозитория должны возвращать старые классы даты/времени, а это кое-что Я хотел бы избежать. Я прочитал документацию Spring Data, но ничего об этом.
РЕДАКТИРОВАТЬ: для тех, у кого есть тот же вопрос, ниже приведено решение, конвертер, предложенный Йенсом.
public class LocalDateTypeConverter {
@Converter(autoApply = true)
public static class LocalDateConverter implements AttributeConverter<LocalDate, Date> {
@Nullable
@Override
public Date convertToDatabaseColumn(LocalDate date) {
return date == null ? null : new Date(LocalDateToDateConverter.INSTANCE.convert(date).getTime());
}
@Nullable
@Override
public LocalDate convertToEntityAttribute(Date date) {
return date == null ? null : DateToLocalDateConverter.INSTANCE.convert(date);
}
}
Iterable<java.sql.Date>
почему вы ожидаете что-то еще? Почему методы репозитория должны возвращать старые классы даты/времени? - person Jens Schauder   schedule 25.10.2017