我在嘗試在記憶體中的 H2 DB 中插入值時遇到問題。
我有這個物體:
@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 測驗儀,并且我的模式的當前日期是2021-12-21-17.44.32,但即使僅使用該日期創建表格也會引發錯誤。
關于表的更多資訊:
表(以及列)是使用創建的,spring.jpa.hibernate.ddl-auto=update所以我假設列型別是DATE(作為物體欄位)。
所以我試圖yyy-MM-dd-HH.mm.ss在DATE列中插入一個帶有格式的字串(如果我沒記錯的話)。
所以有什么問題?不能將此模式作為日期從字串插入到記憶體資料庫中的 H2 中嗎?
提前致謝。
uj5u.com熱心網友回復:
您的問題不是 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"),您在代碼中定義的完全未知。
這只是在 DB 中執行的腳本。DB 如何知道如何將此 String 轉換為有效的 Date 物件?您必須在腳本中告知從 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
uj5u.com熱心網友回復:
有點晚,但仍然:)
假設 (h2, in-mem):
CREATE TABLE myTable(Id NUMBER primary key,START_DATE TIMESTAMP,END_DATE
TIMESTAMP);
然后:
INSERT INTO myTable (ID, START_DATE, END_DATE) VALUES
喜歡:
(1, {ts '2020-08-07 00:00:00'}, {ts '2021-12-31 23:59:59'}),
(標準時間格式)
或者:
(2, parsedatetime('2020-04-03-14.00.00', 'yyyy-MM-dd-HH.mm.ss'),
parsedatetime('2021-01-14-18.30.00', 'yyyy-MM-dd-HH.mm.ss'));
(自定義的)
參考:
https://www.h2database.com/html/tutorial.html#date_time
H2 資料庫字串到時間戳
uj5u.com熱心網友回復:
如果您只是想將 a 插入java.util.Date到TIMESTAMP您不需要的列中@DateTimeFormat。您沒有決議任何內容,而是從Date物件中分離出來,JPA 將其轉換為正確的 SQL 資料型別。
以這種方式定義列:
@Column(name = "startDate")
@Temporal(value=TemporalType.DATE)
private Date startDate;
你應該很高興去。
更新
如果只有DATE模式有效,而沒有TIMESTAMP模式有效,則意味著已使用錯誤的資料型別定義了該列。DATE 和 TIMESTAMP 是兩種不同的 H2 資料型別(在所有其他 DDBB 中,但可能具有不同的名稱)
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/390075.html
上一篇:在SpringBoot中向本機查詢添加引數會導致“org.hibernate.exception.SQLGrammarException”,
