Java 在JOOQ中分页之前获取总行数?
我很想知道,在使用Java 在JOOQ中分页之前获取总行数?,java,jdbc,jooq,Java,Jdbc,Jooq,我很想知道,在使用OFFSET和LIMIT分页之前,是否有一种更优化的方法可以从JOOQ查询中获取总行数 我们尝试使用JOOQs合成SEEK子句,但是因为我们的id是无序的uuid,所以它不起作用 我们当前的实现是执行两次查询,第一次是在设置偏移量和限制以获取结果/行计数之前 然后我们在第二个查询中得到结果 SelectQuery<Record> select = context.selectQuery(); select.addSelect(FOO_TABLE.fi
OFFSET
和LIMIT
分页之前,是否有一种更优化的方法可以从JOOQ查询中获取总行数
我们尝试使用JOOQs合成SEEK子句,但是因为我们的id是无序的uuid,所以它不起作用
我们当前的实现是执行两次查询,第一次是在设置偏移量和限制以获取结果/行计数之前
然后我们在第二个查询中得到结果
SelectQuery<Record> select = context.selectQuery();
select.addSelect(FOO_TABLE.fields());
select.addFrom(FOO_TABLE);
int totalElements = select.fetch().size();
select.addOffset(20);
select.addLimit(50));
List<Foo> paginatedFoo = select.fetchInto(Foo.class);
SelectQuery=context.SelectQuery();
select.addSelect(FOO_TABLE.fields());
选择.addFrom(FOO_表);
int totalElements=select.fetch().size();
选择.addOffset(20);
选择.addLimit(50));
List paginatedFoo=select.fetchInto(Foo.class);
这只是这个实现/设计必须接受的东西,还是有任何JDBC驱动程序魔法可以消除在DB上执行两个查询的需要
欢迎任何意见或建议
我们尝试使用JOOQs合成SEEK子句,但是因为我们的id是无序的uuid,所以它不起作用
当您分页时,您可以按对用户有意义的内容进行排序。因此,您可能需要先订购/查找一些其他列(例如一些DATE
列),然后使用UUID
仅获得明确、稳定的结果。我不明白为什么SEEK
不适合你
如果使用对您的应用程序有意义,从逻辑上讲,出于性能方面的原因,它更可取:
//不要这样做!
int totalElements=select.fetch().size();
您现在正在传输整个数据集!如果必须计算单独查询中的行数,请至少在数据库中完全运行该查询:
//改为这样做(在添加限额之前):
context.fetchCount(选择);
但是为什么不直接使用窗口功能呢?将DSL.count().over()
添加到查询中,以计算在未分页且已全部设置的情况下查询生成的行总数
之所以可以使用窗口函数进行此操作,是因为它们是在所有其他操作(WHERE
、groupby
、have
等)之后,但在分页之前(OFFSET
、LIMIT
)方便地计算出来的