用户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);
// Не понятно что делать дальше
}
};
}
JdbcBatchItemWriter
不会有帮助。您需要编写代码来保存用户及其设备
,并将该代码包装为自定义Spring Batch编写器。否则,使用ORM将实体映射到表,并使用JpaItemWriter
或HibernateItemWriter
。
这里有一个类似的问题:使用spring batch读取一条记录/项,并写入多条记录/项
问题内容: 我有(简化示例): 和一个具体的(简化示例): 现在我需要包括列的索引,和。 如果我添加到hibernate中,则会向继承自的每个Entity 添加一个索引。 我试过了,但是它不能用于索引。 有任何想法吗? 问题答案: 如果正在使用,则可以将类注释及其属性索引一起使用 请注意,如文档所述 仅当表生成有效时才使用它们。默认为无其他索引。 ,如上所示,接受列名列表作为逗号分隔的列表。 如果
我在SQL服务器数据库中有表用户,有近30列。我还为相应的数据库表创建了一个JPA实体。JPA实体如下所示: 现在我正在尝试创建一个本机查询,它只会从用户表中获取id和name。Repository类看起来像这样。 现在,当它被执行时,它会抛出一个异常,如下所示: 当我将地址列添加到我的查询时,这个异常会消失,但它会出现在另一个字段中。 所以,现在我想修改JPA实体,使这个字段成为可选的。我试过使
但这会产生以下错误: 更新 我试图创建一个类,实现,它基本上试图将对象表示为,其中对象可以是任何类型。当前正在使用和操作和方法中的字段,并使用上述方法创建和对象以调用getter和setter方法。我想知道是否可以将这两个单独的方法合并为一个。 可用作到的示例类: 下面是预期的用法:
问题内容: 我正在参加的编程班上为我提供了一个项目,但我不知道从哪里开始,并希望有人可以将我推向正确的方向。我只发布项目的一部分,以便有人可以向我展示一些代码,以了解如何完成编程,因为我之前参加过编程课程,但是我没有实践。 创建一个具有以下类的名为Registrar的应用程序: 一个学生类,该类至少为学生存储以下数据字段: 名称 学生证号码 学分数 还应该提供以下方法: 初始化名称和ID字段的构造
我想创建一个从一个设备到一个节点服务器的实时音频流,然后可以将该实时提要广播到几个前端。 我已经为此进行了广泛的搜索,并且真的碰壁了,所以希望有人能帮忙。 我能够得到我的音频输入从API。 然后将流传递给函数,该函数使用API创建createMediaStreamSource` 在我的函数中,我现在有一个对象,我可以流式处理它。 目前,我通过套接字连接以流的形式发送音频事件,如下所示: 这是最好的
我有个问题。当我有其他实体时,我不知道如何创建API。我与邮递员工作,当我做一个请求,以看到所有项目从数据库,我想收到实体也。 例如,这是我的实体: