Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/396.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在JOOQ中分页之前获取总行数?_Java_Jdbc_Jooq - Fatal编程技术网

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
不适合你

如果使用对您的应用程序有意义,从逻辑上讲,出于性能方面的原因,它更可取:

  • 你不必数数,因为这无关紧要
  • 这只是这个实现/设计必须接受的东西,还是有任何JDBC驱动程序魔法可以消除在DB上执行两个查询的需要

    对于一个数据库来说,这需要做很多额外的工作。特别是如果你这样做:

    //不要这样做!
    int totalElements=select.fetch().size();
    
    您现在正在传输整个数据集!如果必须计算单独查询中的行数,请至少在数据库中完全运行该查询:

    //改为这样做(在添加限额之前):
    context.fetchCount(选择);
    
    但是为什么不直接使用窗口功能呢?将
    DSL.count().over()
    添加到查询中,以计算在未分页且已全部设置的情况下查询生成的行总数

    之所以可以使用窗口函数进行此操作,是因为它们是在所有其他操作(
    WHERE
    groupby
    have
    等)之后,但在分页之前(
    OFFSET
    LIMIT
    )方便地计算出来的