java - 在内存 DB 中的 H2 中插入日期时 DateTimeFormat 无效

标签 java spring-boot h2 date-format

我在尝试将值插入内存中的 H2 数据库时遇到问题。

我有这个实体:

@Entity
@Table(name="myTable")
public class MyEntity {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private long id;
    
    @Column(name = "startDate")
    @DateTimeFormat(pattern="yyy-MM-dd-HH.mm.ss")
    private Date startDate;
    
    @Column(name = "endDate")
    @DateTimeFormat(pattern="yyy-MM-dd-HH.mm.ss")
    private Date endDate;
}

我使用了模式 yyy-MM-dd-HH.mm.ss 因为日期的格式类似于 2021-06-14-00.00.002021-12-31-23.59.59

导入的@DateTimeFormatorg.springframework.format.annotation.DateTimeFormat;Datejava.util.Date

要在数据库中插入值,我有这个脚本:

INSERT INTO myTable (ID, START_DATE, END_DATE) VALUES
(1, '2020-08-07-00.00.00', '2021-12-31-23.59.59'),
(2, '2020-04-03-14.00.00', '2021-01-14-18.30.00'),
(3, '2020-09-15-00.00.00', '2021-06-15-11.00.00'),
(4, '2020-01-18-16.00.00', '2021-12-31-23.59.59');

但是它抛出一个错误:

Caused by: org.h2.jdbc.JdbcSQLDataException: Imposible interpretar la constante "TIMESTAMP" "2021-12-31-23.59.59"
Cannot parse "TIMESTAMP" constant "2021-12-31-23.59.59"; SQL statement:
INSERT INTO myTable (ID, ...

...

Caused by: java.lang.NumberFormatException: 31-23.59.59

错误中的非英文文本类似于“无法解释常量“TIMESTAMP””。

我还测试了一些东西,(这很重要!)删除小时、分钟和秒,程序可以运行,所以我认为是模式不正确。

此 SQL 脚本有效:

INSERT INTO myTable (ID, START_DATE, END_DATE) VALUES
(1, '2020-08-07', '2021-12-31'),
(2, '2020-04-03', '2021-01-14'),
(3, '2020-09-15', '2021-06-15'),
(4, '2020-01-18', '2021-12-31');

我检查了一个 DateTimeFormat tester online我的模式的当前日期是 2021-12-21-17.44.32,但即使仅使用该日期创建表也会引发错误。

关于表格的更多信息:
该表(以及列)是使用 spring.jpa.hibernate.ddl-auto=update 创建的,所以我假设列类型是 DATE(作为实体字段) .

所以我试图在 DATE 列中插入格式为 yyy-MM-dd-HH.mm.ss 的字符串(如果我没记错的话).

那么,问题是什么?无法将此模式作为日期从内存数据库中的 H2 中的字符串插入吗?

提前致谢。

最佳答案

您的问题不在于 Java 代码中定义的 JPA 层,而在于您执行的脚本。

INSERT INTO myTable (ID, START_DATE, END_DATE) VALUES
(1, '2020-08-07-00.00.00', '2021-12-31-23.59.59'),
(2, '2020-04-03-14.00.00', '2021-01-14-18.30.00'),
(3, '2020-09-15-00.00.00', '2021-06-15-11.00.00'),
(4, '2020-01-18-16.00.00', '2021-12-31-23.59.59');

这与您定义 JPA 层的方式无关。对于该脚本,当执行 @DateTimeFormat(pattern="yyy-MM-dd-HH.mm.ss") 时,您完全不知道您在代码中定义了什么。

这只是在数据库中执行的脚本。数据库如何知道如何将此字符串转换为有效的日期对象?您必须在脚本中告知必须如何从 String 转换为 Date。

以下内容应该有效,因为 PARSEDATETIME 是 H2 的函数。

INSERT INTO myTable (ID, START_DATE, END_DATE) VALUES (1, PARSEDATETIME('2020-08-07-00.00.00','yyyy-MM-dd-HH.mm.ss'), PARSEDATETIME('2021-12-31-23.59.59','yyyy-MM-dd-HH.mm.ss') 

请同时仔细检查您执行的 yyy-MM-dd-HH.mm.ssyyy 不符合您在 2020 年之前放置在脚本中的年龄。这是 yyyy

关于java - 在内存 DB 中的 H2 中插入日期时 DateTimeFormat 无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70442279/

相关文章:

java - 具有 onclick 功能的动态复选框列表

java - 如何禁用 Spring Boot 安全性

java - H2:WHERE 子句中的 "data conversion error"

java - 替代 Java 中的固定大小数组?

java - java中支持嵌套对象模型的最佳方式是什么?

java - 为什么我的方法会在中间返回?

java - 使用 Tomcat 8 将外部日志记录配置的位置指定到特定的 Web 应用程序

java - Spring Data JPA 方法 + REST : Enum to Integer conversion

mysql - 命名异常 : Cannot create resource instance with tomcat7-maven-plugin h2/mysql database

sql - H2 条件合并