gpt4 book ai didi

java - 如何在 Spring Batch 中读取类 jdbcBatchItemWriter 的 bean 中的 hashmap

转载 作者:太空宇宙 更新时间:2023-11-04 12:37:35 25 4
gpt4 key购买 nike

我试图将 2 个 sql 语句传递给实现 itemWriter 的 java 类,以将数据写入我的 posgres 数据库。我正在尝试通过 HashMap 来做到这一点

       <beans:bean id="someItemWriter" scope="step"
class="org.springframework.batch.item.database.JdbcBatchItemWriter">
<beans:property name="dataSource" ref="someSource" />
<beans:property name="sql" ref = "sqlStatements" >
</beans:property>
<beans:property name="itemPreparedStatementSetter" ref="myPreparedStatementSetter" />
</beans:bean>

引用:

       <util:map id = "sqlStatements" map-class= "java.util.HashMap" key-type= "java.lang.String" value-type="java.lang.String">
<beans:entry key = "insert" value ="${fetch.some.sql}"/>
<beans:entry key = "update" value = "${fetch.someAnother.sql}" />

</util:map>

但我收到以下错误:

Cannot convert value of type [java.util.HashMap] to required type [java.lang.String] for property 'sql': no matching editors or conversion strategy found

我做错了什么?我该如何应对?

最佳答案

添加:有时更新/有时插入

好的,根据您的评论,您遇到的情况是有时想要更新,有时想要插入。有两种方法可以执行此操作:1) 使用单个 JdbcBatchItemWriter 并使用 MERGE 查询。其语法将根据您的数据库而有所不同。 2) 使用ClassifierItemWriter,如下所示:

<bean id="classifierWriter" class="org.springframework.batch.item.support.ClassifierCompositeItemWriter">
<property name="classifier">
<bean class="com.package.SimpleClassifier">
<property name="insertWriter" ref="insertWriter" />
<property name="updateWriter" ref="updateWriter" />
</bean>
</property>
</bean>

<bean id="insertWriter" ... />

<bean id="updateWriter" ... />

然后是一个 Classifier 实现,如下所示:

public class SimpleClassifier implements Classifier<InsertUpdateObject, ItemWriter<? extends InsertUpdateObject>> {

private ItemWriter<? extends InsertUpdateObject> insertWriter;
private ItemWriter<? extends InsertUpdateObject> updateWriter;

@Override
public ItemWriter<? extends InsertUpdateObject> classify(InsertUpdateObject item) {
if (item.getFlag() == 0) {
return insertWriter;
}
return updateWriter;
}

// setters and getters

}

运行多个查询

首先,您不想使用 HashMap,因为您无法确保 SQL 的顺序。

接下来,您需要将多个 JdbcBatchItemWriter 包装在一个 CompositeItemWriter 中,如下所示:

<bean id="compositeWriter" class="org.springframework.batch.item.support.CompositeItemWriter"  scope="step">
<property name="delegates">
<list>
<ref bean="writer1" />
<ref bean="writer2" />
</list>
</property>
</bean>

<bean id="writer1" scope="step"
class="org.springframework.batch.item.database.JdbcBatchItemWriter">
<property name="dataSource" ref="someSource" />
<property name="sql" value="${fetch.some.sql}" />
<property name="itemPreparedStatementSetter" ref="myPreparedStatementSetter" />
</bean>

<bean id="writer2" scope="step"
class="org.springframework.batch.item.database.JdbcBatchItemWriter">
<property name="dataSource" ref="someSource" />
<property name="sql" value="${fetch.someAnother.sql}" />
<property name="itemPreparedStatementSetter" ref="myPreparedStatementSetter" />
</bean>

这将允许您列出所需数量的语句,并确保它们按照您指定的顺序运行。

关于java - 如何在 Spring Batch 中读取类 jdbcBatchItemWriter 的 bean 中的 hashmap,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37156512/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com