2016-05-11 3 views
1

2つのsqlステートメントをitemWriterを実装するJavaクラスに渡して、データを自分のポーズDBに書き込もうとしています。私はハッシュマップバネバッチのクラスjdbcBatchItemWriterのbeanでハッシュマップを読み取る方法

 <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> 

REFを通してそれをやろうとしています:

 <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 

私が間違っているのは何?。私はそれにどのように取り組むべきですか?

+0

ハッシュマップが読み込まれていると、マップを文字列に変換できないと言われていますので、itemWriterのフィールド "sql"は文字列であり、マップではないと思います... – Nadir

+0

あなたは常にINSERTと '更新?あるいは時には 'INSERT'する必要がありますが、他の時は' UPDATE'する必要がありますか? –

+0

これはINSERT(IF NOT EXISTS)とUPDATE(IF EXISTS)のようなものです –

答えて

0

を追加しました:たまに更新/時々

オーケーを挿入しますが、あなたのコメントを考えると、あなたは時々更新したい条件を持って、時にはあなたは、挿入したいです。これを行うには2つの方法があります。1)JdbcBatchItemWriterを1つ使用し、MERGEクエリを使用します。これの構文はDBに基づいて異なります。以下に示すように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の順序を保証できないためです。これは、あなたが好きなだけ文をリストアップし、それらが実行を保証することができます

<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> 

次に、あなたがここで何をしたいだろうことは、単一のCompositeItemWriterJdbcBatchItemWriterのようにのようなラップ倍数であります指定した順序。

+0

これは私が複数のSQL文を1つずつ実行できるようにすると思います。しかし、私はIFの条件を持っているので、フラグ= 0の場合はINSERT文が実行され、フラグが1の場合はUPDATE文が実行されます。 –

+0

編集された答えです。うまくいけば、あなたの特定のユースケースに役立ちます –

+0

ありがとう、それは動作します! –

関連する問題