【问题标题】:How to find duplicate rows in database table and update flag to the duplicate rows in Spring Batch?如何在 Spring Batch 中查找数据库表中的重复行并将标志更新为重复行?
【发布时间】:2021-04-30 11:13:23
【问题描述】:

描述:假设一个表中有 5 行。 3 行是重复的,所以我需要将 3 行中的 2 行更新为“Y”,因为它们是重复的,并将 2 行写入 .csv 文件。怎么做?下面是我的一些代码。

  public Step step1() {
    return stepBuilderFactory.get("step1").<Account, 
   Account>chunk(100).reader(reader(dataSource)).processor(processor())
            .writer(writer()).build();
}

@Bean
public Job writeDuplicateJob() {
    return jobBuilderFactory.get("writeDuplicateJob").incrementer(new RunIdIncrementer()).flow(step1()).end()
            .build();
}
    @Bean
    public ItemReader<Account> reader(DataSource dataSource) {

 final String QUERY="SELECT CUSTOMERID,SAVINGSNUMBER,CURRENTNUMBER,CREDITNUMBER,LOAN_ID,DUPLICATE FROM ACCOUNT";
    
     return new JdbcCursorItemReaderBuilder<Account>().name("QUERY").sql(QUERY)
            .dataSource(dataSource)
            .rowMapper(new BeanPropertyRowMapper<>(Account.class))
            .build();
}


     @Bean
     public FlatFileItemWriter<Account> writer(){
    FlatFileItemWriter<Account> writer = new FlatFileItemWriter<Account>();
    writer.setResource(new ClassPathResource("accounts.csv"));
    
    DelimitedLineAggregator<Account> lineAggregator = new DelimitedLineAggregator<Account>();
    lineAggregator.setDelimiter(",");
    
    BeanWrapperFieldExtractor<Account>  fieldExtractor = new BeanWrapperFieldExtractor<Account>();
    fieldExtractor.setNames(new String[]{"customerId","savingsNumber","currentNumber","creditNumber","loanId","duplicate"});
    lineAggregator.setFieldExtractor(fieldExtractor);
    
    writer.setLineAggregator(lineAggregator);
    return writer;
}

 //item writer
@Override
public List<Account> process(List<Account> item) throws Exception {
    for (Account acc : item) {
        if (seenAccounts.contains(acc)) {
            acc.setDuplicate("Y");
            finalList.add(acc);
        } else
            acc.setDuplicate("N");

        finalList.add(acc);
    }

    return finalList;
}

【问题讨论】:

标签: java spring spring-batch


【解决方案1】:

要查找重复项,您可以使用如下 SQL 查询:

select id, field, count(*) from table group by field having count(*) > 1

现在您可以使用类似的查询找到不重复的

select * from table where id not in (
   select id, field, count(*) from table group by field having count(*) > 1
)

并将它们写入文件,但由于您需要使用Y 标记重复项,我不确定您是否可以一步完成。您需要执行两个步骤:

  • 步骤1:使用上述查询查找重复项并将重复标记更新为Y
  • 第 2 步:读取非重复项并将其写入文件

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-05
    • 1970-01-01
    • 2013-10-13
    • 2021-12-07
    • 2013-08-14
    相关资源
    最近更新 更多