Java setFirstResult和setMaxResults未按预期工作

Java setFirstResult和setMaxResults未按预期工作,java,hibernate,sqlite,dialect,Java,Hibernate,Sqlite,Dialect,我的应用程序中的分页有问题。我想使用setFirstResult和setMaxResults方法,但它给了我错误的输出: (我的数据库:SQLite) 例如: Session session = HibernateUtil.getSessionFactory().openSession(); int page = 0; int maxRows = 20; while (page < 5) { Criteria criteria = se

我的应用程序中的分页有问题。我想使用setFirstResult和setMaxResults方法,但它给了我错误的输出:

(我的数据库:SQLite)

例如:

    Session session = HibernateUtil.getSessionFactory().openSession();

    int page = 0;
    int maxRows = 20;

    while (page < 5) {

        Criteria criteria = session.createCriteria(Book.class);
        criteria.setFirstResult(page * maxRows).setMaxResults(maxRows);
        criteria.addOrder(Order.asc("id"));
        List<Book> list = criteria.list();

        System.out.println("FirstRow: " + page * maxRows + " - RowsLimit: " + maxRows);
        for (Book b : list) {
            System.out.println(b.getId());
        }
        page++;
    }
    session.close();
我不知道为什么只有前两个“页面”工作正常,在它们之后,它给了我相同范围的行


Thx的任何建议

好,这里是解决方案

问题出在SQLite方言中。只需将此方法添加到您的SQLITE中:

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

您知道如何配置Hibernate以打印出它正在生成的SQL吗?您是指Hibernate.cfg.xml中的“show\u SQL”、“format\u SQL”和“use\u SQL\u comments”属性吗?是的。只需将
show_sql
format_sql
设置为
true
。有趣的是,它只打印了作者的子选择查询(它处于(作者)多对一(书籍)关系中)
Hibernate:将此\uID选择为id0\u0\u0,将此\uFirstName选择为firstName0\u0\u0\u0,此.lastName作为lastName0\u 0\u作者按此\u.id asc限制排序?抵消?FirstRow:20-RowsLimit:20
好的,也许还有另一种方式来进行分页。有点像滚动,但我需要保持高性能。这个表有15000行。思想?
 @Override
 public boolean bindLimitParametersInReverseOrder(){
     return true;
 }