1

spring-batch と hibernate を使用してデータベースからデータをエクスポートしようとしています。実際には、クエリがカーソルを返すストアド プロシージャであるという強い要件があります。このクエリと結果の列は、時々変更される可能性があります。

<sql-query name="reportingQuery" callable="true">
    { call GET_REPORTING_QUERY(?) }
</sql-query>

そこで、 HibernateCursorItemReader と DelimitedLineAggregator を持つ FlatFileItemWriter を使用して簡単なジョブを作成しました。

<batch:step id="extractionStep">
    <batch:tasklet>
        <batch:chunk skip-policy="defaultSkipPolicy" commit-interval="1000">
            <batch:reader>
                <bean class="org.springframework.batch.item.database.HibernateCursorItemReader">
                    <property name="queryName" value="reportingQuery" />
                    <property name="sessionFactory" ref="sessionFactory" />
                    <property name="useStatelessSession" value="true" />
                </bean>
            </batch:reader>
            <batch:writer>
                <bean id="globalQueryItermWriter" class="org.springframework.batch.item.file.FlatFileItemWriter">
                    <property name="resource" value="output.csv" />
                    <property name="lineAggregator">
                        <bean class="org.springframework.batch.item.file.transform.DelimitedLineAggregator">
                            <property name="delimiter" value="," />
                        </bean>
                    </property>
                </bean>
            </batch:writer>
        </batch:chunk>
    </batch:tasklet>
</batch:step>

私の問題は、このように output.csv ファイルにヘッダー行がないことです。行アグリゲーターの fieldExtractor を BeanWrapperFieldExractor に設定しようとしましたが、名前を設定する必要がありました。名前を設定してもあまり役に立ちません。なぜなら、休止状態のカーソル リーダーはフィールドセットではなく object[] のみを返すため、無効なプロパティ エラーが発生するからです。

<property name="fieldExtractor">
  <bean class="org.springframework.batch.item.file.transform.BeanWrapperFieldExtractor">
    <property name="names" value="ID,NAME,DATE,..."></property>
  </bean>
</property>

だから私は基本的に2つの質問があります

  1. 休止状態リーダーから列名を取得し、出力ファイルのヘッダーとして挿入する方法はありますか?
  2. hibernateクエリにフィールドセットを返すように強制する方法(列名の手がかりなし)?

ご協力いただきありがとうございます。

4

1 に答える 1

0

非常に遅いことはわかっていますが、最終的に、プロシージャの列でヘッダーを動的に設定する方法が見つかりませんでした。しかし、itemwriter の headerCallback プロパティに FlatFileHeaderCallback を挿入しました。

そして、列をフィルタリングして並べ替えるパラメーターを最終的に選択した理由を覚えていません。おそらく、出力を変更するたびにストアド プロシージャを変更したくなかったからです。

于 2021-01-15T20:32:13.913 に答える