从具有十进制列和大十进制JPA属性Spring Boot的csv文件插入到H2数据库



我想将数据插入到h2表中,其中包含来自csv文件的decimal(13, 4)列,但我得到以下错误

org.springframework.jdbc.datasource.init.ScriptStatementFailedException at ScriptUtils.java:622
Caused by: org.h2.jdbc.JdbcSQLDataException at DbException.java:457
Caused by: java.lang.NumberFormatException at BigDecimal.java:577

这是csv文件

username,name,grupo,amount,percentage
MYUSER,CLIENT NAME,THE GROUP,30545000,0.093438569266185,

this is my table

create table my_table
(
mytable_id integer     NOT NULL AUTO_INCREMENT,
user                   varchar(30) NOT NULL,
name            varchar(300)   DEFAULT NULL,
grupo         varchar(300)   DEFAULT NULL,
amount                 DECIMAL(13, 4) DEFAULT NULL,
percentage    decimal(5, 2)  DEFAULT NULL,
PRIMARY KEY (mytable_id)
);

这是我的JPA实体类

@Builder
@Data
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Table(name = "my_table")
public class CreditLineSummaryJPA {
@Id
@Column(name = "mytable_id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long mytableId;
@Column(name = "user")
private String user;
@Column(name = "name")
private String name;
@Column(name = "grupo")
private String grupo;
@Column(name = "amount")
private BigDecimal amount;
@Column(name = "percentage")
private double userPercentage;
}

,这是从CSV文件

插入的SQL语句
INSERT INTO my_table(user, name, the_group, amount, user_percentage)
SELECT "username", "name", "grupo", CONVERT("amount", decimal(13, 4)),
CONVERT ("percentage", decimal(5, 2))
FROM CSVREAD( 'myFile.csv', 'charset=UTF-8');

返回以下错误

org.springframework.jdbc.datasource.init.ScriptStatementFailedException at ScriptUtils.java:622
Caused by: org.h2.jdbc.JdbcSQLDataException at DbException.java:457
Caused by: java.lang.NumberFormatException at BigDecimal.java:577

编辑使用双引号后,现在的错误是显示

org.h2.jdbc.JdbcSQLSyntaxErrorException: Column "username" not found; SQL statement

CSVREAD的第二个参数是一个列名称列表:https://h2database.com/html/functions.html csvread

在你的例子中应该是NULL:

CSVREAD('myFile.csv', NULL, 'charset=UTF-8')

CSV中没有空格的列名通常转换为大写(但这取决于数据库设置),所以如果你想引用它们,你需要用大写("USERNAME"等)来写它们,或者你可以不带引号来写它们:

INSERT INTO my_table(user, name, grupo, amount, percentage)
SELECT username, name, grupo, CAST(amount AS decimal(13, 4)),
CAST(percentage AS decimal(5, 2))
FROM CSVREAD('myFile.csv', NULL, 'charset=UTF-8');

其他注意事项

  1. 不要使用CONVERT,它是JDBC的一部分,但它根本不可靠,在H2中它的行为还取决于兼容模式。使用CAST规范,它是SQL标准的一部分。
  2. CAST规范(或CONVERT函数)可能在这种特定情况下被删除,INSERT语句将自己将所有值转换为列的数据类型。
  3. DEFAULT NULL没有意义;如果没有指定value,将自动插入NULL,不需要任何附加子句。DEFAULT NULL不是NOT NULL的反义词,DEFAULTNOT NULL约束的存在与否没有任何关系。
  4. 使用GENERATED BY DEFAULT AS IDENTITY在最新版本的H2如果你不使用MySQL兼容模式AUTO_INCREMENT是一种传统的非标准和不可移植的语法,在H2中它应该只在这种兼容模式下使用。

相关内容

  • 没有找到相关文章

最新更新