Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/72.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
Mysql &引用;寻求;使用jOOQ跳过行的分页_Mysql_Jooq - Fatal编程技术网

Mysql &引用;寻求;使用jOOQ跳过行的分页

Mysql &引用;寻求;使用jOOQ跳过行的分页,mysql,jooq,Mysql,Jooq,我试图使用jOOQ(3.11.12)+MySQL(5.7.24)实现“seek”分页 我有一个产品表,其中包含以下行: ID | Name | Created At ---------------------- --------- ------------------- XjpPXlZxT5i3tTjO7lZQ6Q Product A 2019-10-25 03:23:05 SmytEB9lTW-UiVFhg_gViQ Product

我试图使用jOOQ(3.11.12)+MySQL(5.7.24)实现“seek”分页

我有一个产品表,其中包含以下行:

ID                    | Name      | Created At
----------------------  ---------   -------------------
XjpPXlZxT5i3tTjO7lZQ6Q  Product A   2019-10-25 03:23:05
SmytEB9lTW-UiVFhg_gViQ  Product B   2019-10-09 05:43:44
glpNYcsBTJqAzQERbgGh5g  Product C   2019-10-02 14:53:48
HDZ1K7g_Rj-2vdQaEj79Ow  Product D   2019-09-07 14:52:56
aTcWWxdJSReZBGzkLXuNIQ  Product E   2019-09-06 08:21:24
HPOD380mTR-g2Ut4Da0k4Q  Product F   2019-09-06 08:19:57
jXzfHBDAQ6We4CjXLem_WA  Product G   2019-09-06 08:16:06
duxiQ3InRXaFy_JVDkkewQ  Product H   2019-09-06 08:15:02
QF-3ECfLQD2vdVGE_5X-rQ  Product I   2019-09-04 12:35:00
zRnp0tLZRjSsQHN0wV7N_w  Product J   2019-09-04 12:34:28
6Y3E3KkITYWbOs5aOQCHOw  Product K   2019-09-04 10:33:38
ZOoG06ThRTiDDhteIW_6tA  Product L   2019-09-04 10:19:14
6UW4MUClSLSuQI3pkA0qJA  Product M   2019-09-04 10:18:40
假设我的应用程序一次显示5个产品的页面,从最新到最旧排序

因此,我按创建日期降序排序,也按ID排序,以便消除可能在同一时刻创建的产品之间的歧义

我正在尝试获取第二页的结果。代码(中替换了相关的运行时值)如下所示:

selectFromWhere // <-- assume this to be a SelectConditionStep built with various filter criteria
    .orderBy(TBL_PRODUCT.CREATED_AT.desc(), TBL_PRODUCT.ID.asc())
    .seek(2019-09-06T08:21:24Z, "aTcWWxdJSReZBGzkLXuNIQ") // <-- runtime values
    .limit(limit)
    .fetchInto(Product::class.java)

selectFromWhere/假设
TBL_PRODUCT.CREATED_的数据库列类型为
DATETIME
,对应的Java类型为
Java.sql.Timestamp
(这是jOOQ 3.11中的默认值),当MySQL服务器的时区与Java客户端的时区不同时,可能会出现这种情况,因为JDBC驱动程序将为您转换时间戳(有关详细信息,请参阅)

还可以使用各种JDBC连接URL参数来控制此行为(请参阅)。一个选项是使用
serverTimezone
JDBC URL属性指定客户端的时区作为要使用的会话时区(例如
serverTimezone=Europe/Zurich


时区总是会引起令人不快的惊喜,特别是在JDBC的环境中:-(

您的方法没有问题。但是,您的两个事务是否看到相同的数据?@LukasEder我确信应用程序和我的db client viewer会话连接到同一个源。只有一个其他db可能被引用,但它具有完全不同的ID。嗯,这里的明显区别是如果bind变量被截断或强制转换为date,您的第二次运行将产生预期结果。您是否有任何转换器或数据类型绑定可以产生这种截断?@LukasEder spot on!我刚刚尝试使用硬编码的日期参数值来
seek()
并在应用程序中获得了正确的结果。感谢您为我指明了正确的方向!您是否发现jOOQ中存在问题?或者是您的客户端代码导致了问题?我认为这正是问题所在。客户端代码正在从中表示的ISO-8601字符串创建
java.sql.Timestamp
实例UTC,但将其转换为本地时区(与UTC偏移).我已经修补了字符串->时间戳代码,现在结果似乎是正确的…但我仍然不太清楚为什么我能够将jOOQ生成的SQL复制/粘贴到我的DB客户端,并观察到正确的结果,而不是来自应用程序的错误结果。我是否有一些默认的隐式UTC转换n jOOQ?我忘了在我之前的评论之前加上一句话,肯定您关于列类型和Java类型的假设都是正确的
select distinct 
  id, created_at
from tbl_product
where (
    (
    created_at < {ts '2019-09-06 08:21:24.0'}
    or (
      created_at = {ts '2019-09-06 08:21:24.0'}
      and id > 'aTcWWxdJSReZBGzkLXuNIQ'
    )
  )
)
order by 
  created_at desc, 
  id asc
limit 5