您不能有嵌套块,因此您可以编写自己的 CompositeItemReader 之类的(伪代码):
class CompositeItemReader implements ItemReader<Transaction> {
ItemReader<Promotion> promotions;
ItemReader<Transaction> transactions;
public void setPromotions(ItemReader<Promotion> promotions) {...}
public Transaction read() {
Transaction item = transactions.read();
if(null == item) {
Promotion p = promotions.read();
if(null != p) {
// Close transactions reader, create dynamic query and open transaction reader
// Re-read item!
item = this.read();
}
}
return item;
}
}
但请记住将促销和交易注册为流,并记住管理可重启性。
或者,如果您确定每个 Promotion 都有一个有限的 List<> 关联交易,您可以使用ItemProcessor<Promotion,List<Transaction>>
转换单个 Promotion 的 a,例如(驱动基于查询的 ItemReaders):
class PromotionProcessor implements ItemProcessor<Promotion,List<Transaction>> {
public List<Transaction> process(Promotion item) {
Query q = <create dynamic query>;
return q.list();
}
}
其他基于 PeekableItemReader 和数据持有者的解决方案,如此处所述
希望这些考虑可以有所帮助!好工作!