我正在尝试使用 spring-batch 和休眠从数据库中导出数据。实际上强烈的要求是查询是一个返回游标的存储过程。此查询和结果列可能会不时更改。
<sql-query name="reportingQuery" callable="true">
{ call GET_REPORTING_QUERY(?) }
</sql-query>
所以我用 HibernateCursorItemReader 和 FlatFileItemWriter 用 DelimitedLineAggregator 写了一个简单的工作:
<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>
所以我基本上有两个问题
- 有没有办法从休眠阅读器中检索列名并将其作为输出文件的标题注入?
- 如何强制休眠查询返回一个字段集(没有列名的线索)?
谢谢你的帮助。