Spring批处理JpaPagingItemReader(可能)在使用SELECT本机查询

时间:2015-07-06 12:55:59

标签: mysql spring groovy orm spring-batch

我尝试使用JpaPagingItemReader执行本机SELECT查询。但是,当我运行它时,一些记录将从我的数据库中删除(我在使用mysql控制台执行批处理作业之前和之后检查了它)。我与MySQL数据库通信的唯一地方是我读取数据时 - 如下所示:

@Autowired
EntityManagerFactory entityManagerFactory

@Value('${integration.date.value}')
String date


@Bean
JpaPagingItemReader<Entry> entryJpaPagingItemReader() {
    JpaPagingItemReader jpaPagingItemReader = new JpaPagingItemReader<Entry>()
    jpaPagingItemReader.setEntityManagerFactory(entityManagerFactory)
    jpaPagingItemReader.setQueryProvider(createQueryProvider())
    jpaPagingItemReader.setPageSize(500)
    jpaPagingItemReader.afterPropertiesSet()
    jpaPagingItemReader
}

private JpaNativeQueryProvider<Entry> createQueryProvider() {
    String query = "SELECT distinct * FROM entry e WHERE e.entry_formal_category in ('FIL','SER') " +
            "and e.entry_categories not regexp 'DZI|INN|DOK' and e.entry_date = \'" + date + "\'" +
            " GROUP BY e.entry_title ORDER BY e.entry_id"

    JpaNativeQueryProvider<Entry> queryProvider = new JpaNativeQueryProvider<Entry>()
    queryProvider.setSqlQuery(query)
    queryProvider.setEntityClass(Entry)
    queryProvider.afterPropertiesSet()
    queryProvider
}

我对此行为感到非常震惊 - 每次执行作业时,我都会从数据库中丢失大约10到50条记录。问题可能是由分页本机查询结果引起的吗?

编辑:稍微更新一下。当我将pageSize设置为1500(它是一个大小,将保存一页上的所有行)时,问题不会发生。它看起来可能是一个弹簧批错误。

1 个答案:

答案 0 :(得分:1)

好的 - 我错过了一个修改了Entry对象的地方,并且在获取另一个页面之前,更改已传播到数据库。春季批次运作得非常好 - 这是我的错。问题解决了 - 谢谢! :)