【问题标题】:When i am using it with db2 for pagination, my next page is giving error当我将它与 db2 一起用于分页时,我的下一页出现错误
【发布时间】:2017-03-24 03:36:43
【问题描述】:

我正在使用带有 db2 的 spring data jpa。我的第一张唱片来了。但是当我做下一个时,它给了我错误。我猜可能是因为db2。当我使用索引 0 时,它工作正常。但是当我使用索引 1 时,它会给出数据访问异常。

在第二页上,我的可分页对象出现错误

Pageable pageable = new PageRequest(2, 10, Direction.ASC, "messageId"),因为这个 2(正如上面提到的 index 应该是 0),它抛出了下面的错误

com.ibm.db2.jcc.am.SqlSyntaxErrorException: DB2 SQL 错误: SQLCODE=-199, SQLSTATE=42601, SQLERRMC=OF;??( [ DESC ASC NULLS RANGE CONCAT || / MICROSECONDS MICROSECOND, DRIVER=3.69 .24

【问题讨论】:

  • 你能举个例子吗?
  • 我正在使用 Pageable pageable = new PageRequest(offsetValue - 1, 10, Direction.ASC, "messageId") 和 repository.findById(id, pageable)。但是当我调试它时,它给了我错误。我正在使用弹簧数据 jpa
  • 我已经编辑了我的问题。
  • 显然您的 JPA 实现生成了无效的 SQL。
  • 但是它是如何正确生成第一次记录的。

标签: spring-boot db2 spring-data spring-data-jpa


【解决方案1】:

听从 Abdul Gaffar Khan 的建议对我有用。这是我必须改变的:

将我的扩展 DB2 方言添加到我的 application.properties 文件中:

spring.jpa.properties.hibernate.dialect=com.my.package.to.MyDB2Dialect
spring.jpa.database=db2

扩展了 DB2Dialect:

import org.hibernate.dialect.DB2Dialect;
import org.hibernate.dialect.pagination.AbstractLimitHandler;
import org.hibernate.dialect.pagination.LimitHandler;
import org.hibernate.dialect.pagination.LimitHelper;
import org.hibernate.engine.spi.RowSelection;

public class MyDB2Dialect extends DB2Dialect {

    private static final AbstractLimitHandler MY_LIMIT_HANDLER = new AbstractLimitHandler() {
        @Override
        public String processSql(String sql, RowSelection selection) {
            if (LimitHelper.hasFirstRow( selection )) {
                //nest the main query in an outer select
                return "select * from ( select inner2_.*, rownumber() over() as rownumber_ from ( "
                        + sql + " fetch first " + getMaxOrLimit( selection ) + " rows only ) as inner2_ ) as inner1_ where rownumber_ > "
                        + selection.getFirstRow() + " order by rownumber_";
            }
            return sql + " fetch first " + getMaxOrLimit( selection ) +  " rows only";
        }

        @Override
        public boolean supportsLimit() {
            return true;
        }

        @Override
        public boolean useMaxForLimit() {
            return true;
        }

        @Override
        public boolean supportsVariableLimit() {
            return false;
        }
    };

    @Override
    public boolean supportsSequences() {
        return false;
    }

    @Override
    public LimitHandler getLimitHandler() {
        return MY_LIMIT_HANDLER;
    }
}

【讨论】:

【解决方案2】:

实际上 org.hibernate.dialect.DB2Dialect 类生成了无效的查询,为什么它失败了你必须通过覆盖它的方法来纠正查询。

replace over( order by order of inner2_)  with over()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多