为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

一只萌萌小番薯 2021-09-15 15:29:34
我正在使用 Spring Boot 和 Hiberna 创建一个 Spring 批处理作业,但在插入过程中遇到了问题。这是代码的相关部分:@Bean    public JdbcBatchItemWriter<OphthalmicLens> writer(DataSource dataSource) throws SQLException {        return new JdbcBatchItemWriterBuilder<OphthalmicLens>()                .itemSqlParameterSourceProvider(new BeanPropertyItemSqlParameterSourceProvider<>())                .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)")                .dataSource(dataSource).build();    }属性设计是一个枚举:public enum OphthalmicDesign {    SPHERIC, ASPHERIC, ATORIC, BIASPHERIC}这是在我的OphthalmicLens豆子中使用的:@NotNull    @Enumerated(EnumType.STRING)    @Column(nullable = false)    private OphthalmicDesign design = OphthalmicDesign.SPHERIC;我正在使用 Mysql 5.7,并且数据库中的该列按预期作为 VARCHAR(255) 映射。我理解问题是枚举未转换为字符串。我可以使用不同的方法来解决这个问题,BeanPropertyItemSqlParameterSourceProvider但我认为这太过分了,而且我会失去 Spring 设施的优势。即使我使用 Spring Batch,您是否有提示告诉 Spring/Hibernate 自动将该枚举转换为字符串?
查看完整描述

1 回答

?
蝴蝶刀刀

TA贡献1801条经验 获得超8个赞

您可以指示BeanPropertyItemSqlParameterSourceProvider返回VARCHAR字段的类型,design如下所示:


@Bean

public JdbcBatchItemWriter<OphthalmicLens> writer(DataSource dataSource) throws SQLException {

    return new JdbcBatchItemWriterBuilder<OphthalmicLens>()

            .itemSqlParameterSourceProvider(new BeanPropertyItemSqlParameterSourceProvider<OphthalmicLens>() {

                @Override

                public SqlParameterSource createSqlParameterSource(OphthalmicLens item) {

                    return new BeanPropertySqlParameterSource(item) {

                        @Override

                        public int getSqlType(String paramName) {

                            if (paramName.equalsIgnoreCase("desing")) {

                                return Types.VARCHAR;

                            }

                            return super.getSqlType(paramName);

                        }

                    };

                }

            })

            .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)")

            .dataSource(dataSource)

            .build();

}


查看完整回答
反对 回复 2021-09-15
  • 1 回答
  • 0 关注
  • 187 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信