DB2SQL错误:jpa分页项读取器引发SQLCODE=-270异常



我创建了一个带有项目读取器、项目处理器和项目编写器的spring批处理服务。我扩展了AbstractPagingItemReader,并创建了自己的JpaPagingItemsReader实现。现在,当我运行批处理服务时,阅读器会从数据库中读取一组固定的记录(默认页面大小:10),处理并写入它们。然而,在第二次阅读时,它给了我以下例外:

2015-06-25 16:33:00,712 ERROR [jobLauncherTaskExecutor-6][saeedh:120659] org.hibernate.util.JDBCExceptionReporter : DB2 SQL Error: SQLCODE=-270, SQLSTATE=42997, SQLERRMC=63, DRIVER=3.61.65
2015-06-25 16:33:00,712 ERROR [jobLauncherTaskExecutor-6][saeedh:120659] org.hibernate.util.JDBCExceptionReporter : DB2 SQL Error: SQLCODE=-727, SQLSTATE=56098, SQLERRMC=2;-270;42997;63, DRIVER=3.61.65
2015-06-25 16:33:00,712 ERROR [jobLauncherTaskExecutor-6][saeedh:120659] org.hibernate.util.JDBCExceptionReporter : DB2 SQL Error: SQLCODE=-727, SQLSTATE=56098, SQLERRMC=2;-270;42997;63, DRIVER=3.61.65
javax.persistence.PersistenceException: org.hibernate.exception.SQLGrammarException: could not execute query
com.ibm.db2.jcc.am.SqlSyntaxErrorException: DB2 SQL Error: SQLCODE=-270, SQLSTATE=42997, SQLERRMC=63, DRIVER=3.61.65
    at com.ibm.db2.jcc.am.ed.a(ed.java:676)
    at com.ibm.db2.jcc.am.ed.a(ed.java:60)
    at com.ibm.db2.jcc.am.ed.a(ed.java:127)
    at com.ibm.db2.jcc.am.gn.c(gn.java:2554)
    at com.ibm.db2.jcc.am.gn.d(gn.java:2542)
    at com.ibm.db2.jcc.am.gn.a(gn.java:2034)
    at com.ibm.db2.jcc.am.hn.a(hn.java:6500)
    at com.ibm.db2.jcc.t4.cb.g(cb.java:140)
    at com.ibm.db2.jcc.t4.cb.a(cb.java:40)
    at com.ibm.db2.jcc.t4.q.a(q.java:32)
    at com.ibm.db2.jcc.t4.rb.i(rb.java:135)

我知道这个错误可能是因为表中有一个CLOB列,我从中读取记录,但奇怪的是,它读取第一批10条记录很好,处理并写入它们,但在第二次读取时,它抛出了上述异常。有什么建议吗?下面是我写的JpaPagingItemReader的一个片段。AbstractPagingItemReader.java.中的override doReadPage方法

protected void doReadPage ()
    {
        setPageSize (10);
        // Flush we already have in entity manager
        getEntityManager ().flush ();
        // clear the entity manager: To read and detach
        getEntityManager ().clear ();
        Query query = createQuery ().setFirstResult (getPage () * getPageSize ()).setMaxResults (getPageSize ());
        if (parameterValues != null)
        {
            for (Map.Entry<String, Object> me : parameterValues.entrySet ())
            {
                query.setParameter (me.getKey (), me.getValue ());
            }
        }
        if (results == null)
        {
            results = new CopyOnWriteArrayList<T> ();
        }
        else
        {
            results.clear ();
        }
        results.addAll (query.getResultList ());
        // Detach all objects that became part of persistence context
        getEntityManager ().clear ();
    }

任何帮助都是非常感谢的,因为我已经落后于最后期限由于这个问题。如果你认为有什么遗漏,请告诉我,我会更新问题。谢谢

我想明白了。事实上,问题是我们不允许将Clob数据作为可滚动JPA游标中的投影。前10条记录读取得很好,但一旦开始读取第二批,它就必须将光标从0移动到第11条记录。那是我得到sql异常的时候。

简单的修复方法是从select语句中删除CLOB列,并在需要其值的单独查询中获取它。这解决了我的问题。谢谢

最新更新