java Spring batch merge query with compositeItemWriter

s2j5cfk0  于 2023-04-04  发布在  Java
关注(0)|答案(1)|浏览(127)

在我的Spring批处理应用程序中,我运行两个SQL语句上的插入和一个合并.第一个查询插入数据在一个表从固定长度的文件.没有问题,直到这一点.我的第二个查询是合并查询与一些条件.根据该标准要么插入记录或合并记录.奇怪的是,插入和更新都发生在一个查询.我使用的是compositeItemWriter

@Bean
public JdbcBatchItemWriter<LiborObj> insertW() throws Exception{
    JdbcBatchItemWriter<LiborObj> batchItemWriter = new JdbcBatchItemWriter<>();
    batchItemWriter.setDataSource(oracleDataSource);
    batchItemWriter.setSql(sqlInsert);
    batchItemWriter.setItemSqlParameterSourceProvider(new BeanPropertyItemSqlParameterSourceProvider<LiborObj>());
    return batchItemWriter;
}

@Bean
public JdbcBatchItemWriter<LiborObj> mergeQuery() throws Exception{
    JdbcBatchItemWriter<LiborObj> batchItemWriter = new JdbcBatchItemWriter<>();
    batchItemWriter.setDataSource(oracleDataSource);
    batchItemWriter.setSql(sqlMerge);
    batchItemWriter.setItemPreparedStatementSetter(new ItemPreparedStatementSetter<LiborObj>() {
        @Override
        public void setValues(LiborObj liborObj, PreparedStatement ps) throws SQLException {
            ps.setLong(1,jobContainer.getFeedFile().getPkey());
        }
    });
    return batchItemWriter;
}

@Bean
public CompositeItemWriter<LiborObj> compositeItemWriter() throws Exception {
    CompositeItemWriter<LiborObj> compositeItemWriter = new CompositeItemWriter<>();
    compositeItemWriter.setDelegates(Arrays.asList(insertW(), mergeQuery()));
    return compositeItemWriter;
}

我的合并查询是

merge into  mastertbl 
            using (SELECT * FROM (SELECT rwtbl.*, row_number() OVER( PARTITION BY rwtbl.rate_type, rwtbl.cusip , rwtbl.Submitter_Company ORDER BY rwtbl.pkey) AS row_num FROM    rwtbl WHERE rwtbl.ffid = 2931240 order by rwtbl.pkey) WHERE row_num =1 ) rwtbl
            on (( mastertbl.rate_type = rwtbl.rate_type ) AND ( mastertbl.cusip = rwtbl.cusip ) AND ( mastertbl.Submitter_Company = rwtbl.Submitter_Company ))
            when not matched then
            insert..(,activity_status,).... values... (,'I',)...
    when matched then
            update....activity_status='U'

当我第一次运行这个查询时,它应该在主表中插入记录,但它也会更新记录。在主表中,我可以看到activity_status 'U'。这意味着在某个地方也执行了update语句,但第一次当主表为空时,应该总是activity_status ='I'

cuxqih21

cuxqih211#

CompositeItemWriter按照注册委托的相同顺序执行所有委托。
您可以使用ClassifierCompositeItemWriter对要插入或更新的项目进行分类,并将它们路由到正确的项目编写器。
您还可以使用自定义项编写器,该编写器根据所需的条件调用插入或更新查询。

相关问题