spring批量导入期间枚举到字符串的转换失败

pxy2qtax  于 2021-06-21  发布在  Mysql
关注(0)|答案(1)|浏览(421)

我正在使用springboot和hiberna创建一个spring批处理作业,但是在插入过程中遇到了一个问题。这是代码的相关部分:

  1. @Bean
  2. public JdbcBatchItemWriter<OphthalmicLens> writer(DataSource dataSource) throws SQLException {
  3. return new JdbcBatchItemWriterBuilder<OphthalmicLens>()
  4. .itemSqlParameterSourceProvider(new BeanPropertyItemSqlParameterSourceProvider<>())
  5. .sql("INSERT INTO OphthalmicLens (`createdBy`,`createdDate`,`lastModifiedBy`,`lastModifiedDate`,`sid`,`version`,`manufacturer`,`manufacturerCode`,`name`,`sku`,`upc`,`cylinder`,`design`,`diameter`,`index`,`material`,`source`,`sphere`,`type`) VALUES (:createdBy,NOW(),:lastModifiedBy,NOW(),UUID(),:version,:manufacturer,:manufacturerCode,:name,:sku,:upc,:cylinder,:design,:diameter,:index,:material,:source,:sphere,:type)")
  6. .dataSource(dataSource).build();
  7. }

属性设计是一个枚举:

  1. public enum OphthalmicDesign {
  2. SPHERIC, ASPHERIC, ATORIC, BIASPHERIC
  3. }

在我的生活中 OphthalmicLens 如下所示:

  1. @NotNull
  2. @Enumerated(EnumType.STRING)
  3. @Column(nullable = false)
  4. private OphthalmicDesign design = OphthalmicDesign.SPHERIC;

我使用的是mysql 5.7,数据库中的那一列是mappes,正如预期的那样是varchar(255)。
运行作业时出现以下错误:

  1. Caused by: java.sql.BatchUpdateException: Incorrect string value: '\xAC\xED\x00\x05~r...' for column 'design' at row 1
  2. at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[?:1.8.0_172]
  3. at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) ~[?:1.8.0_172]
  4. at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) ~[?:1.8.0_172]
  5. at java.lang.reflect.Constructor.newInstance(Constructor.java:423) ~[?:1.8.0_172]
  6. at com.mysql.cj.util.Util.handleNewInstance(Util.java:210) ~[mysql-connector-java-8.0.11.jar:8.0.11]
  7. at com.mysql.cj.util.Util.getInstance(Util.java:185) ~[mysql-connector-java-8.0.11.jar:8.0.11]
  8. at com.mysql.cj.util.Util.getInstance(Util.java:192) ~[mysql-connector-java-8.0.11.jar:8.0.11]
  9. at com.mysql.cj.jdbc.exceptions.SQLError.createBatchUpdateException(SQLError.java:218) ~[mysql-connector-java-8.0.11.jar:8.0.11]
  10. at com.mysql.cj.jdbc.ClientPreparedStatement.executeBatchedInserts(ClientPreparedStatement.java:768) ~[mysql-connector-java-8.0.11.jar:8.0.11]
  11. at com.mysql.cj.jdbc.ClientPreparedStatement.executeBatchInternal(ClientPreparedStatement.java:444) ~[mysql-connector-java-8.0.11.jar:8.0.11]
  12. at com.mysql.cj.jdbc.StatementImpl.executeBatch(StatementImpl.java:839) ~[mysql-connector-java-8.0.11.jar:8.0.11]
  13. at com.zaxxer.hikari.pool.ProxyStatement.executeBatch(ProxyStatement.java:128) ~[HikariCP-2.7.9.jar:?]

我知道问题是枚举没有转换成字符串。我可以用不同的方法解决这个问题 BeanPropertyItemSqlParameterSourceProvider 但我认为这样做会过分,我会失去 Spring 设施的优势。
你有没有提示让spring/hibernate在我使用spring批处理时自动将枚举转换成字符串?

kdfy810k

kdfy810k1#

你可以指导 BeanPropertyItemSqlParameterSourceProvider 归还 VARCHAR 字段的类型 design 具体如下:

  1. @Bean
  2. public JdbcBatchItemWriter<OphthalmicLens> writer(DataSource dataSource) throws SQLException {
  3. return new JdbcBatchItemWriterBuilder<OphthalmicLens>()
  4. .itemSqlParameterSourceProvider(new BeanPropertyItemSqlParameterSourceProvider<OphthalmicLens>() {
  5. @Override
  6. public SqlParameterSource createSqlParameterSource(OphthalmicLens item) {
  7. return new BeanPropertySqlParameterSource(item) {
  8. @Override
  9. public int getSqlType(String paramName) {
  10. if (paramName.equalsIgnoreCase("desing")) {
  11. return Types.VARCHAR;
  12. }
  13. return super.getSqlType(paramName);
  14. }
  15. };
  16. }
  17. })
  18. .sql("INSERT INTO OphthalmicLens (`createdBy`,`createdDate`,`lastModifiedBy`,`lastModifiedDate`,`sid`,`version`,`manufacturer`,`manufacturerCode`,`name`,`sku`,`upc`,`cylinder`,`design`,`diameter`,`index`,`material`,`source`,`sphere`,`type`) VALUES (:createdBy,NOW(),:lastModifiedBy,NOW(),UUID(),:version,:manufacturer,:manufacturerCode,:name,:sku,:upc,:cylinder,:design,:diameter,:index,:material,:source,:sphere,:type)")
  19. .dataSource(dataSource)
  20. .build();
  21. }
展开查看全部

相关问题