当前位置: 首页 > 知识库问答 >
问题:

DB2 SQL错误:SQLCODE=-270由jpa分页项读取器引发的异常

龚志
2023-03-14

我创建了一个带有项目读取器、项目处理器和项目写入器的spring批处理服务。我扩展了AbstractPagingItemReader,并创建了自己的实现,名为JPapAgingItemReader。现在,当我运行批处理服务时,读取器从db(默认页面大小: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重写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 ();

    }

任何帮助都是非常感谢的,因为我已经落后于最后期限由于这个问题。请如果你认为任何东西是缺失的,请让我知道,我会更新的问题。谢谢。

共有1个答案

冯流觞
2023-03-14

我想通了,问题确实是我们不允许将Clob数据作为可滚动JPA游标中的投影,前10条记录可以读取,但当它开始读取第二批时,它必须将游标从0移动到第11条记录,这就是我遇到sql异常的时候。

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

 类似资料: