与@DateTimeFormat批注一起使用时,Hibernate返回0条记录

时间:2018-12-12 16:04:01

标签: java spring hibernate jpa datetime-format

尝试将数据显示到UI时遇到问题。

当我在MySQL中使用此查询从表中获取Datetime日期时。它确实会返回我想要的记录

guard let managedObj = NSEntityDescription.insertNewObject(forEntityName: entityName, into: Self.persistentContainer.viewContext) as? ManagedObject else {
    throw CoreDataError.entityNotDeclared(name: entityName)
}

这是结果: enter image description here

但是当我使用Spring将相同的数据输入表单并提交时,什么也没有返回。我使用的输入是相同的。

enter image description here

这是结果: enter image description here

我在Controller类中指定了@DateTimeFormat批注,使用的模式与数据库中显示的模式相同,即“ yyyy-MM-dd”

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'

这是我的存储库类:

@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";
    }

为了进行测试,我试图删除该注释并停止从该列中查询,它按预期工作。因此,我很确定@DateTimeFormat批注根本不起作用。还是可以,但是以某种方式,Hibernate无法理解我定义的模式。

enter image description here

我还尝试输入屏幕上显示的值,即2018-02-05 08:00:00.0,但没有任何困难。

有人可以给我任何想法吗?请帮忙!

2 个答案:

答案 0 :(得分:1)

谢谢, 我自己弄清楚了。 我目前在马来西亚吉隆坡工作。因此,默认的'UTC'时区与MySQL日期时间格式不匹配。 (仍使用SYSTEM时间)。 我在application.properties中进行了更改

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

现在一切正常。

答案 1 :(得分:0)

您在MySQL查询中写了flight0_.date_of_departure='02-05-2018'。但是在您的输入形式中为2018-02-05,在Controller方法中为pattern = "yyyy-MM-dd"。如果此方法获得2018-02-05,则“认为” 02是一个月。

我认为日期格式为yyyy-MM-dd和yyyy-dd-MM的问题。此外,我们谈论的是美国航空:)

1-尝试在调试器中查看日期的值。

2-尝试使用明确的日期(例如2017-12-20),也许您会看到一个例外。

3-在查询中尝试使用f.dateOfDeparture>=:dateOfDeparture(可能是时间问题,而不是日期问题)。