Hibernate возвращает 0 записей при использовании с аннотацией @DateTimeFormat - PullRequest
0 голосов
/ 12 декабря 2018

У меня проблема при попытке отобразить данные в пользовательском интерфейсе.

Когда я использую этот запрос в MySQL, чтобы получить дату Datetime из моей таблицы.Он возвращает нужные мне записи

select flight0_.id as id1_0_, flight0_.arrival_city as arrival_2_0_, flight0_.date_of_departure as date_of_3_0_, flight0_.departure_city as departur4_0_, flight0_.estimated_departure_time as estimate5_0_, flight0_.flight_number as flight_n6_0_, flight0_.operating_airlines as operatin7_0_ from flight flight0_ where flight0_.departure_city='AUS' and flight0_.arrival_city='NYC' and flight0_.date_of_departure='02-05-2018'

Это результат: enter image description here

Но когда я использую Spring для ввода тех же данных в форму иотправить его, ничего не возвращается.Используемый мной ввод совпадает.

enter image description here

Это результат: enter image description here

Iзадал аннотацию @DateTimeFormat в моем классе контроллеров, используя тот же шаблон, что и отображаемый в базе данных, который равен "гггг-мм-дд"

@RequestMapping("findFlights")
    public String findFlights(@RequestParam("from") String from, @RequestParam("to") String to,
            @RequestParam("departureDate") @DateTimeFormat(pattern = "yyyy-MM-dd") Date departureDate,
            ModelMap modelMap) {
        List<Flight> flights = repository.findFlights(from, to , departureDate);
        modelMap.addAttribute("flights", flights);

        return "displayFlights";
    }

Вот мой класс репозитория:

public interface FlightRepository extends JpaRepository<Flight, Long> {
    @Query("select f from Flight f where f.departureCity=:departureCity and f.arrivalCity=:arrivalCity and f.dateOfDeparture=:dateOfDeparture")
    List<Flight> findFlights(@Param("departureCity") String from, @Param("arrivalCity") String to, @Param("dateOfDeparture") Date departureDate);
}

Для тестирования я попытался удалить эту аннотацию и прекратить запросы к этому столбцу, он работает как положено.Так что я уверен, что аннотация @DateTimeFormat вообще не работает.Или это работает, но каким-то образом Hibernate не понимает шаблон, который я определил.

enter image description here

Я также попытался ввести значение, отображаемое на экране, что2018-02-05 08: 00: 00.0, но не везет.

Может кто-нибудь дать мне какие-нибудь идеи по этому поводу?Пожалуйста, помогите!

Ответы [ 2 ]

0 голосов
/ 13 декабря 2018

Спасибо, сам разобрался.В настоящее время я работаю в KL, Малайзия.Таким образом, часовой пояс UTC по умолчанию не совпадает с форматом даты и времени MySQL.(который все еще использует время SYSTEM).Я внес изменения в application.properties

spring.datasource.url=jdbc:mysql://localhost:3306/reservation?useLegacyDatetimeCode=false&serverTimezone=Asia/Kuala_Lumpur

И теперь все отлично работает.

0 голосов
/ 13 декабря 2018

Вы пишете flight0_.date_of_departure='02-05-2018' в своем запросе MySQL.Но 2018-02-05 в вашей форме ввода и pattern = "yyyy-MM-dd" в вашем методе контроллера.Если этот метод получает 2018-02-05, то он «думает», что 02 - это месяц.

Я думаю, что проблема в формате даты гггг-ММ-дд и гггг-дд-ММ.Кроме того, мы говорим об American Airlines :)

1 - Попробуйте увидеть значение дат в отладчике.

2 - Попробуйте однозначные даты, например 2017-12-20, и, возможно, вы увидитеисключение.

3 - Попробуйте f.dateOfDeparture>=:dateOfDeparture в своем запросе (возможно, проблема во времени, а не в дате).

...