当前位置: 首页 > 知识库问答 >
问题:

为什么在使用Jooq时,我的日期会后退一次?

高化
2023-03-14

我们正在使用jOOQ与包含以下表的MySQL数据库进行对话:

CREATE TABLE daily_sessions
(
  session_id INT AUTO_INCREMENT NOT NULL,
  user_id    VARCHAR(45)        NULL,
  day        date               NULL,
  CONSTRAINT PK_DAILY_SESSIONS PRIMARY KEY (session_id)
);

我们已经启用了对JSR-310类型的支持,所以我们在Java/Kotlin端使用localdate来映射它。

2019-04-05 09:32:08 [Gax-20    ] DEBUG o.j.i.DefaultConnectionProvider - setting auto commit      : false
2019-04-05 09:32:08 [Gax-20    ] DEBUG o.j.tools.LoggerListener  - Executing query          : select `daily_sessions`.`session_id`, `daily_sessions`.`user_id`, `daily_sessions`.`day` from `daily_sessions` where (`daily_sessions`.`user_id` = ? and `daily_sessions`.`day` = ?)
2019-04-05 09:32:08 [Gax-20    ] DEBUG o.j.tools.LoggerListener  - -> with bind values      : select `daily_sessions`.`session_id`, `daily_sessions`.`user_id`, `daily_sessions`.`day` from `daily_sessions` where (`daily_sessions`.`user_id` = '87a09702-0d6b-485c-895c-986f238e1d30' and `daily_sessions`.`day` = {d '2011-11-11'})
2019-04-05 09:32:08 [Gax-20    ] DEBUG o.j.tools.LoggerListener  - Fetched result           : +----------+------------------------------------+----------+
2019-04-05 09:32:08 [Gax-20    ] DEBUG o.j.tools.LoggerListener  -                          : |session_id|user_id                             |day       |
2019-04-05 09:32:08 [Gax-20    ] DEBUG o.j.tools.LoggerListener  -                          : +----------+------------------------------------+----------+
2019-04-05 09:32:08 [Gax-20    ] DEBUG o.j.tools.LoggerListener  -                          : |        13|87a09702-0d6b-485c-895c-986f238e1d30|2011-11-10|
2019-04-05 09:32:08 [Gax-20    ] DEBUG o.j.tools.LoggerListener  -                          : +----------+------------------------------------+----------+
2019-04-05 09:32:08 [Gax-20    ] DEBUG o.j.tools.LoggerListener  - Fetched row(s)           : 1
2019-04-05 09:32:08 [Gax-20    ] DEBUG o.j.i.DefaultConnectionProvider - commit                   
2019-04-05 09:32:08 [Gax-20    ] DEBUG o.j.i.DefaultConnectionProvider - setting auto commit      : true
2019-04-05 09:32:08 [Gax-20    ] DEBUG c.z.hikari.pool.PoolBase  - HikariPool-1 - Reset (isolation) on connection com.mysql.cj.jdbc.ConnectionImpl@4af95547

注意选择如何在2011-11-11上进行筛选,但是结果表显示2011-11-10

这是一个测试,在我的本地机器(UTC+10)上运行,对本地运行的标准MySQLDocker映像进行测试。

尽管使用了date,但我认为我们遇到了一些时区问题,但是我不能通过直接讨论JDBC来重现这个问题。我尝试在其他测试运行的相同设置中运行这个:

@Test
fun testDateColumn() {
    DriverManager.getConnection("jdbc:mysql://localhost:8890/rewards-test", "root", "").use { con ->
        con.createStatement().use { stmt ->
            stmt.execute("insert into `daily_sessions` (`user_id`, `day`) values ('a20add98-5a93-417f-a771-848757b2b1f8', {d '2011-11-11'})")
        }
        con.createStatement().use { stmt ->
            stmt.executeQuery("select `daily_sessions`.`session_id`, `daily_sessions`.`user_id`, `daily_sessions`.`day` from `daily_sessions` where (`daily_sessions`.`user_id` = 'a20add98-5a93-417f-a771-848757b2b1f8' and `daily_sessions`.`day` = {d '2011-11-11'})").use { rs ->
                while (rs.next()) {
                    println("${rs.getString(3)} - ${rs.getDate(3)}")
                }
            }
        }
    }
}

此代码产生预期的输出。SQL语句是jOOQ日志的直接副本。jOOQ一定做了其他我不明白的事情。

我需要在jOOQ中配置时区吗?还是我还漏掉了什么?

更新

@Test
fun testDateColumn() {
    DriverManager.getConnection("jdbc:mysql://localhost:8890/rewards-test", "root", "").use { con ->
        con.prepareStatement("insert into `daily_sessions` (`user_id`, `day`) values (?, ?)").use { ps ->
            ps.setString(1, "a20add98-5a93-417f-a771-848757b2b1f8")
            ps.setDate(2, Date.valueOf(LocalDate.of(2011, 11, 11)))
            ps.execute()
        }
        con.prepareStatement("select `daily_sessions`.`session_id`, `daily_sessions`.`user_id`, `daily_sessions`.`day` from `daily_sessions` where (`daily_sessions`.`user_id` = ? and `daily_sessions`.`day` = ?)").use { ps ->
            ps.setString(1, "a20add98-5a93-417f-a771-848757b2b1f8")
            ps.setDate(2, Date.valueOf(LocalDate.of(2011, 11, 11)))
            ps.executeQuery().use { rs ->
                    while (rs.next()) {
                        println("${rs.getString(3)} - ${rs.getDate(3)}")
                    }
                }
        }
    }
}
ps.setDate(2, Date.valueOf(LocalDate.of(2011, 11, 11)), Calendar.getInstance())

共有1个答案

戚令秋
2023-03-14

这是MySQL JDBC驱动程序中的一个已知错误。我的修复是恢复到一个比问题更早的旧版本。

 类似资料:
  • 我最近开始使用QUnit来单元测试我的JavaScript,我有点困惑的功能在那里留档:。 根据文档,设计用于: [s]指定在测试中预期运行多少个断言。 这是他们给出的例子: 我在这里唯一看到的是维护噩梦。每次向测试添加断言时,都必须更新该数字,否则测试将失败。这种功能是否有实际应用?

  • 我有一个todo列表存储在mysql数据库中,存储的列是todoTitle和todoDate,当我将todoDate打印到屏幕上时,你可以在下面的代码中看到,它将显示日期递减一天,例如,如果数据库中的日期显示为2016-12-20,在我的网站上它将显示为2016-12-19。 如果你想知道为什么todoDate会变成string,然后变成substring,那是因为如果我不这么做,它会像这样打印出

  • 我已经编写了一个程序,它监视一个目录,并在用户添加文件时发出警报,该文件的特定格式为用户名。文件它工作正常,但当我在收到新文件被添加的警报时按ok,程序退出,我希望它保持运行。 下面我写的代码将作为该应用程序中另一个PYQT应用程序的子进程运行。因此,我不会执行main(),而只是实例化SendMyFiles对象。

  • 我有一个带有索引的ISODate()类型字段的数据库(我也用字符串字段尝试了这个实验——结果相同)。我使用的是MongoDB(4. x)的开源版本,当我进行查询/排序以查找最大_finish_time时,除非我指定提示,否则不会使用索引。 我的问题是: 这解释为: 扫描整个收藏。当我为可用索引指定提示时,如: 我得到了查询计划: 它使用索引。我不想在查询中添加hint(),我对它为什么拒绝使用索引

  • 为什么我的 Docker 在执行我的 shell 脚本后退出?谢谢。 Docker版本: 我的图片: 运行后: 我检查了:< code>docker ps -a 以下是run.sh: 我得到了日志: 之后,我的码头集装箱出口: 但是,当我使用时: 我的容器工作得很好。为什么?

  • 我正试着从后面取回碎片。它正在被检索,但问题是在按下后退按钮时,当前片段的oncreate视图和后续lifecyce方法也会被调用。下面是我将片段放入backbackback的代码: 以下是片段的代码: