当前位置: 首页 > 知识库问答 >
问题:

如何使用ArrayList字段为实体创建spring batch ItemWriter?

云镜
2023-03-14

用户Spring批处理查找实体表。问题是关于ItemWriter,或者,可能是关于ItemProc的。

对于这个实体,一切都很好。我可以从源代码中读取实体,并将其保存到用户_导出表中

@Getter @Setter
class User{
    String objectId;
    String rev;
    String value;
    String type;
}

我有一个ItemWriter

    @Bean
    @StepScope
    public ItemWriter<UserExport> writer() {
        JdbcBatchItemWriter<UserExport> writer = new JdbcBatchItemWriter<>();
        writer.setDataSource(dataSource);

        String sql = "insert into User_export(objectId, REV, Value, Type)" +
                "values (:objectId, :rev, :value, :type)";
        writer.setSql(sql);

        writer.setItemSqlParameterSourceProvider(new BeanPropertyItemSqlParameterSourceProvider<>());
        writer.afterPropertiesSet();
        return writer;
    }

2)比,我在我的实体用户添加字段。这个字段是列表,我需要将这个字段保存在其他表Device_Export中。

@Getter @Setter
class User{
    String objectId;
    String rev;
    String value;
    String type;
    List<String> devices;
}

我有两个表格用户导出和设备导出。设备导出具有用户导出的外键,并且关系是多个设备与一个用户的关系。我需要按表映射我的用户实体。所以,我的解决方案是:

     @Bean
    public Step exportStep1() {
        return stepBuilderFactory.get("step1").<InputUser, List<OutputUser>>chunk(1)
                .reader(reader())
                .processor(processor())
                .writer(writer())
                .build();
    }

读者-

Reader(从源talbe读取实体)-这是OK。

@Bean
public JdbcCursorItemReader<User> reader() {
    JdbcCursorItemReader<InputUser> reader = new JdbcCursorItemReader<>();
    String sql = "select * from User_Table";
    reader.setSql(sql);
    reader.setDataSource(dataSource);
    reader.setName("User_Table");
    reader.setRowMapper(new BeanPropertyRowMapper<>(User.class));
    return reader;
}

处理后,我有用户实体与设备的填充列表。我需要将其映射到表:

我用了ComposeWriter:

@Bean
    @StepScope
    @DependsOn({"userWriter", "deviceWriter"})
    public CompositeItemWriter composeWriter() {
        CompositeItemWriter writer = new CompositeItemWriter();

        ItemWriter<UserExport> userWriter = userWriter();
        ItemWriter<DeviceExport> deviceWriter = deviceWriter();
        List<ItemWriter> writers = new ArrayList<>();
        writers.add(userWriter);
        writers.add(deviceWriter);

        writer.setDelegates(writers);
        return writer;
    }


    @Bean
    @StepScope
    public ItemWriter<UserExport> userWriter() {
        JdbcBatchItemWriter<UserExport> writer = new JdbcBatchItemWriter<>();
        writer.setDataSource(dataSource);

        String sql = "insert into User_Export (objectId, REV, Value, Type)" 
                "values (:objectId, :rev, :value, :type)";
        writer.setSql(sql);

        writer.setItemSqlParameterSourceProvider(new BeanPropertyItemSqlParameterSourceProvider<>());
        writer.afterPropertiesSet();
        return writer;
    }

    @Bean
    @StepScope
    public ItemWriter<DeviceExport> deviceWriter() {
        JdbcBatchItemWriter<DeviceExport> writer = new JdbcBatchItemWriter<>();
        writer.setDataSource(dataSource);

        String sql = "insert into Device_Export (PR_KEY, objectId, device) values (:prKey, :objectId, :device)";
        writer.setSql(sql);

        writer.setItemSqlParameterSourceProvider(new BeanPropertyItemSqlParameterSourceProvider<>());
        writer.afterPropertiesSet();
        return writer;
    }

但有了这样的ItemWriter,我只能在设备表中写一条记录。如何在设备导出中写入设备(记录)列表?

我的处理器是这样的:

    @Bean
    public ItemProcessor<User, List<OutputUser>> processor() {
        return new ItemProcessor<User, List<OutputUser>>() {
            @Override
            public List<OutputUser> process(OutputUser item) throws Exception {
                OutputUser outputUser = mapToUser(item);
                List<OutputDevice> outputDevices = mapToDevices(item);
                // Не понятно что делать дальше
            }
        };
    }

共有1个答案

子车峰
2023-03-14

JdbcBatchItemWriter不会有帮助。您需要编写代码来保存用户及其设备,并将该代码包装为自定义Spring Batch编写器。否则,使用ORM将实体映射到表,并使用JpaItemWriterHibernateItemWriter

这里有一个类似的问题:使用spring batch读取一条记录/项,并写入多条记录/项

 类似资料:
  • 问题内容: 我有(简化示例): 和一个具体的(简化示例): 现在我需要包括列的索引,和。 如果我添加到hibernate中,则会向继承自的每个Entity 添加一个索引。 我试过了,但是它不能用于索引。 有任何想法吗? 问题答案: 如果正在使用,则可以将类注释及其属性索引一起使用 请注意,如文档所述 仅当表生成有效时才使用它们。默认为无其他索引。 ,如上所示,接受列名列表作为逗号分隔的列表。 如果

  • 我在SQL服务器数据库中有表用户,有近30列。我还为相应的数据库表创建了一个JPA实体。JPA实体如下所示: 现在我正在尝试创建一个本机查询,它只会从用户表中获取id和name。Repository类看起来像这样。 现在,当它被执行时,它会抛出一个异常,如下所示: 当我将地址列添加到我的查询时,这个异常会消失,但它会出现在另一个字段中。 所以,现在我想修改JPA实体,使这个字段成为可选的。我试过使

  • 但这会产生以下错误: 更新 我试图创建一个类,实现,它基本上试图将对象表示为,其中对象可以是任何类型。当前正在使用和操作和方法中的字段,并使用上述方法创建和对象以调用getter和setter方法。我想知道是否可以将这两个单独的方法合并为一个。 可用作到的示例类: 下面是预期的用法:

  • 问题内容: 我正在参加的编程班上为我提供了一个项目,但我不知道从哪里开始,并希望有人可以将我推向正确的方向。我只发布项目的一部分,以便有人可以向我展示一些代码,以了解如何完成编程,因为我之前参加过编程课程,但是我没有实践。 创建一个具有以下类的名为Registrar的应用程序: 一个学生类,该类至少为学生存储以下数据字段: 名称 学生证号码 学分数 还应该提供以下方法: 初始化名称和ID字段的构造

  • 我想创建一个从一个设备到一个节点服务器的实时音频流,然后可以将该实时提要广播到几个前端。 我已经为此进行了广泛的搜索,并且真的碰壁了,所以希望有人能帮忙。 我能够得到我的音频输入从API。 然后将流传递给函数,该函数使用API创建createMediaStreamSource` 在我的函数中,我现在有一个对象,我可以流式处理它。 目前,我通过套接字连接以流的形式发送音频事件,如下所示: 这是最好的

  • 我有个问题。当我有其他实体时,我不知道如何创建API。我与邮递员工作,当我做一个请求,以看到所有项目从数据库,我想收到实体也。 例如,这是我的实体: