当我使用它与db2进行分页时,我的下一页是错误的

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了当我使用它与db2进行分页时,我的下一页是错误的相关的知识,希望对你有一定的参考价值。

我正在使用带有db2的spring数据jpa。我的第一套记录即将到来。但是当我做下一个时,它给了我错误。我想这可能是因为db2。当我使用索引0时它工作正常。但是当我使用索引1时,它会提供数据访问异常。

在第二页,我得到以下错误我的可分页对象

Pageable pageable = new PageRequest(2,10,Direction.ASC,“messageId”),因为这2(因为它提到索引应该是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

答案

实际上,org.hibernate.dialect.DB2Dialect类生成无效查询,说明为什么它无法通过覆盖其方法来纠正查询。

replace over( order by order of inner2_)  with over()
另一答案

继阿卜杜勒·加法尔·汗之后,我的建议对我有用。这是我必须改变的:

将我的扩展DB2 Dialect添加到我的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;
    }
}

以上是关于当我使用它与db2进行分页时,我的下一页是错误的的主要内容,如果未能解决你的问题,请参考以下文章

ngx-分页单击下一页不起作用

Grails extJS 网格分页

django 做了搜索之后再做分页 结果显示第一页是正常的 但是按下一页后显示出整个主页的第二页

带有分页的下一页链接

页面设置中“分页符”和“下一页”的区别是啥?

Laravel 7中的AJAX分页(内部服务器错误)