我在尝试将值插入内存中的 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.00
或 2021-12-31-23.59.59
。
导入的@DateTimeFormat
是org.springframework.format.annotation.DateTimeFormat;
,Date
是java.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.ss
。 yyy
不符合您在 2020 年之前放置在脚本中的年龄。这是 yyyy
关于java - 在内存 DB 中的 H2 中插入日期时 DateTimeFormat 无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70442279/