【问题标题】:jooq timestamp arithmetic Cannot convert from Integer to LocalDateTimejooq 时间戳算术无法从整数转换为 LocalDateTime
【发布时间】:2021-11-15 07:11:38
【问题描述】:

对于 jooq 3.13.x,我们正在使用

Field<Instant> midPointDueTime = TICKET.READY.plus(TICKET.DUE.minus(TICKET.READY).div(2));

其中 READY 和 DUE 字段的类型为 java.time.Instant。它们是数据库中的 DATETIME 字段(通常是 java.sql.Timestamp),但使用 javax.persistence.AttributeConverter 转换为 Instant。有问题的数据库是 Informix,但我们现在正在使用带有 DEFAULT 方言的开源版本的 jooq,并试图避免出现偏离标准 SQL 语法的情况。

从该字段声明 jooq 3.13.x 创建以下 SQL sn-p,它按预期工作

TICKET.READY + ((TICKET.DUE - TICKET.READY) / 2))

这是预期的 DATETIME 算法。我们正在寻找介于 READY 和 DUE 之间的时间戳。

但是 jooq 3.14 或 3.15 都会抛出运行时异常。

org.jooq.exception.DataTypeException:无法从 2(java.lang.Integer 类)转换为 java.time.LocalDateTime 类

没有生成 SQL,所以我认为这不是 Informix 兼容性问题。错误发生在记录任何 SQL 语句之前。

这可能是一个错误,或者我可以做些什么来获得相同的日期算术结果?

【问题讨论】:

标签: jooq


【解决方案1】:

关于方言

来自SQLDialect.DEFAULTjavadoc:

在没有更明确的方言的情况下选择此方言。它不打算与任何实际数据库一起使用,因为它可能会结合来自各种方言的特定方言。

这种方言的目的是在没有其他方言可用的情况下使用,并且需要调试日志信息,例如写作时:

DSL.abs(1).toString(); // This uses DEFAULT to render the abs(1) function call

你不应该在任何生产环境中使用这种方言,它的行为可能会因为各种原因随时改变。它肯定没有与任何 RDBMS 进行集成测试。请改用SQLDialect.INFORMIX 方言

经过进一步研究

感谢您详细的错误报告 hree:https://github.com/jOOQ/jOOQ/issues/12544,可以看出这是一个回归,将在 jOOQ 3.16.0 和 3.15.4 中修复

【讨论】:

    猜你喜欢
    • 2015-12-30
    • 1970-01-01
    • 1970-01-01
    • 2018-07-15
    • 1970-01-01
    • 2017-03-29
    • 2019-11-21
    • 2020-03-12
    • 2018-11-30
    相关资源
    最近更新 更多