jOOQ比较日期时不支持java.sql.Date参数触发报错如何解决
报错原因
- jOOQ的
Field.lt()方法是强类型校验的,要求传入的参数类型和字段本身的泛型类型完全一致。你代码中的Msg.MSG.MSGSDAT字段是Field<Timestamp>类型,而你传入的nowDate是java.sql.Date类型,类型不匹配所以触发方法签名不兼容的报错。 - 本质是
java.sql.Date仅存储日期信息,Timestamp同时存储日期和时间信息,jOOQ的类型安全机制默认不允许跨类型的比较操作。
解决方法
以下三种方案任选一种即可:
- 将入参转为Timestamp类型适配字段
// 原有生成nowDate的逻辑不变,新增一行转为Timestamp Timestamp nowTimestamp = new Timestamp(nowDate.getTime()); // 最后一行比较逻辑改为 .and(Msg.MSG.MSGSDAT.lt(nowTimestamp))
- 将字段转为日期类型后再比较
// 用jOOQ内置的date方法把Timestamp类型的字段转为日期类型,适配java.sql.Date参数 .and(DSL.date(Msg.MSG.MSGSDAT).lt(nowDate))
- 调整jOOQ代码生成配置(适合字段实际是DATE类型的场景)
如果数据库中MSGSDAT字段实际存储的就是纯日期没有时间,可以修改jOOQ的代码生成规则,强制将该字段映射为java.sql.Date类型,后续所有用到该字段的比较都不需要额外做类型转换。
内容的提问来源于stack exchange,提问作者Tony B
相关产品推荐
相关产品推荐

