如何从HibernateCursorItemReader中为FlatFileItemWriter检索列名

时间:2012-11-12 14:48:57

标签: hibernate csv spring-batch

我尝试使用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设置为BeanWrapperFieldExrtactor,但我必须设置名称。设置名称并没有多大帮助,因为休眠光标阅读器只返回一个对象[]而不是一个字段集,然后我有一个无效的属性错误。

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

所以我基本上有两个问题

  1. 有没有办法从hibernate reader中检索列名并将其作为输出文件的头部注入?
  2. 如何强制hibernate查询返回一个字段集(没有列名称的线索)?
  3. 感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

我知道已经很晚了,最后我们没有找到一种方法来动态设置Header与程序的列。但是我们在 itemwriter 的 headerCallback 属性中注入了一个 FlatFileHeaderCallback。

而且我不记得为什么我们最终选择了一个参数来过滤和排序列。也许是因为我们不想在每次想要更改输出时都更改存储过程。