简体   繁体   English

错误:SqlExceptionHelper:HOUR_OF_DAY:2 -> 3

[英]Error : SqlExceptionHelper : HOUR_OF_DAY: 2 -> 3

Full error log:完整的错误日志:

2019-09-20 08:35:37.860 INFO 1 --- [nio-8081-exec-1] oac.c.C.[Tomcat-1].[localhost].[/]: Initializing Spring DispatcherServlet 'dispatcherServlet' 2019-09-20 08:35:37.860 INFO 1 --- [nio-8081-exec-1] oac.c.C.[Tomcat-1].[localhost].[/]:初始化 Spring DispatcherServlet'dispatcherServlet'

2019-09-20 08:47:29.726 ERROR 1 --- [nio-8081-exec-5] ohengine.jdbc.spi.SqlExceptionHelper: HOUR_OF_DAY: 2 -> 3 2019-09-20 08:47:29.726 错误 1 --- [nio-8081-exec-5] ohengine.jdbc.spi.SqlExceptionHelper: HOUR_OF_DAY: 2 -> 3

2019-09-20 08:47:29.769 ERROR 1 --- [nio-8081-exec-5] oac.c.C.[.[.[/].[dispatcherServlet]: Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; 2019-09-20 08:47:29.769 错误 1 --- [nio-8081-exec-5] oac.c.C.[.[.[/].[dispatcherServlet]:servlet [dispatcherServlet] 的 Servlet.service()在路径 [] 的上下文中抛出异常 [请求处理失败; nested exception is org.springframework.orm.jpa.JpaSystemException: could not execute query;嵌套异常是 org.springframework.orm.jpa.JpaSystemException:无法执行查询; nested exception is org.hibernate.exception.GenericJDBCException: could not execute query] with root cause嵌套异常是 org.hibernate.exception.GenericJDBCException: 无法执行查询] 根本原因

java.lang.IllegalArgumentException: HOUR_OF_DAY: 2 -> 3 java.lang.IllegalArgumentException:HOUR_OF_DAY:2 -> 3

at java.base/java.util.GregorianCalendar.computeTime(Unknown Source) ~[na:na]在 java.base/java.util.GregorianCalendar.computeTime(未知来源)~[na:na]

at java.base/java.util.Calendar.updateTime(Unknown Source) ~[na:na]在 java.base/java.util.Calendar.updateTime(未知来源)~[na:na]

at java.base/java.util.Calendar.getTimeInMillis(Unknown Source) ~[na:na]在 java.base/java.util.Calendar.getTimeInMillis(未知来源)~[na:na]

This problem has been solved at Java level , but how do I avoid it at mysql level.这个问题在Java级别已经解决了,但是在mysql级别如何避免呢。
In fact the query does not even have date or time.事实上,查询甚至没有日期或时间。

@Query("select o from Order o where o.tickets is not null")
List<Order> ordersWithExistingTickets();

EDIT 1:编辑 1:

Order.java订购.java

@Entity
@Data
@Table(name="orders")
public class Order {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "PK")
private Long pk;

@Column(name = "createdTS")
private ZonedDateTime creationTime;

@Column(name = "tickets")
private String tickets;

public String getTickets() {
    return tickets;
}

public void setTickets(String tickets) {
    this.tickets = tickets;
}}

EDIT 2:编辑 2:

OrderRepository.java OrderRepository.java

@Repository
public interface OrderRepository extends JpaRepository<Order, Long> {

    @Query("select o from Order o where o.tickets is not null")
    List<Order> ordersWithExistingTickets();
}

The reason is there's a date time field (not timestamp) that is not available in your timezone.原因是有一个日期时间字段(不是时间戳)在您的时区不可用。 So it can't convert it correctly.所以它不能正确转换它。

Caused by: java.lang.IllegalArgumentException: HOUR_OF_DAY: 2 -> 3 at java.base/java.util.GregorianCalendar.computeTime(GregorianCalendar.java:2826) at java.base/java.util.Calendar.updateTime(Calendar.java:3428) at java.base/java.util.Calendar.getTimeInMillis(Calendar.java:1812) at com.mysql.cj.result.SqlTimestampValueFactory.localCreateFromTimestamp(SqlTimestampValueFactory.java:108) Caused by: java.lang.IllegalArgumentException: HOUR_OF_DAY: 2 -> 3 at java.base/java.util.GregorianCalendar.computeTime(GregorianCalendar.java:2826) at java.base/java.util.Calendar.updateTime(Calendar.java :3428) at java.base/java.util.Calendar.getTimeInMillis(Calendar.java:1812) at com.mysql.cj.result.SqlTimestampValueFactory.localCreateFromTimestamp(SqlTimestampValueFactory.java:108)

There's information on https://confluence.atlassian.com/jirakb/illegalargumentexception-hour_of_day-after-changing-mysql-database-timezone-1063564762.html https上有信息://confluence.atlassian.com/jirakb/illegalargumentexception-hour_of_day-after-changing-mysql-database-timezone-1063564762.html

but generally you have to locate the errant record and remove or update it from the database.但通常您必须找到错误的记录并从数据库中删除或更新它。

Assuming you're using JOOQ or have access to do it (as using the JPA query will cause issues).假设您正在使用 JOOQ 或有权使用它(因为使用 JPA 查询会导致问题)。 Here's a code snippet I put in my JUnit Integration test这是我在 JUnit 集成测试中放入的代码片段

@Test
void ensureDatesAreOkayDuringDaylightSavings() {
  var fallbackDayClauses = IntStream
    .range(2000, LocalDate.now().getYear() + 1)
    .mapToObj(year ->
      LocalDate.ofYearDay(year, 1)
        .withMonth(3)
        .with(TemporalAdjusters.next(DayOfWeek.SUNDAY))
        .with(TemporalAdjusters.next(DayOfWeek.SUNDAY))
        .atTime(1, 59, 0)
    )
    .map(startDateTime -> 
        MYDB.CREATED_ON.between(
          startDateTime, 
          startDateTime
            .plusHours(1)
            .plusMinutes(2)))
    .collect(Collectors.toSet());

  var potentialProblemIds = dsl.select(MYDB.ID)
    .from(MYDB.TABLE)
    .where(or(fallbackDayClauses))
    .fetch(MYDB.ID);

  assertThat(potentialProblemIds)
    .isEmpty();

}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM