Kotlin使用jOOQ SQL构造器基于Date对象添加日期范围where查询条件
实现方案
核心逻辑
jOOQ原生支持java.util.Date类型作为查询参数,你只需要将目标时间列显式声明为Date类型的jOOQ字段,直接调用between方法传入你已有的Date对象即可,框架会自动处理参数绑定、类型适配,不需要手动格式化日期字符串。
前置修正
你原有代码里的日期格式化存在错误:yyyy-mm-dd中的mm代表分钟,月份需要用大写的MM,否则会出现日期解析错误,需要先修正这部分。
修正后的完整代码
import org.jooq.* import org.jooq.impl.DSL import java.text.SimpleDateFormat import java.time.Instant import java.util.* // 修正日期格式化符,mm改MM val format = SimpleDateFormat("yyyy-MM-dd") format.timeZone = TimeZone.getTimeZone("UTC") val defaultValueLower = format.parse("1970-01-01") val defaultValueUpper = Date.from(Instant.now()) val create = DSL.using(SQLDialect.POSTGRES) val query: Query = create.select() .from(DSL.table("datasets")) // 新增where条件,指定timestamp字段为Date类型,传入已有的Date对象做区间筛选 .where(DSL.field("timestamp", Date::class.java).between(defaultValueLower, defaultValueUpper)) .orderBy(DSL.field("id").desc()) .limit(DSL.inline(100))
拓展说明
- 上述代码的
between是闭区间逻辑,如果你需要左闭右开区间(比如排除结束日期零点之后的数据),可以替换成如下写法:.where( DSL.field("timestamp", Date::class.java).ge(defaultValueLower) .and(DSL.field("timestamp", Date::class.java).lt(defaultValueUpper)) ) - 如果你使用的是jOOQ 3.14+版本,也可以直接用Java 8+的时间类(比如
Instant、LocalDateTime)替换Date,只需要对应修改字段声明的类型即可。
内容的提问来源于stack exchange,提问作者Luca
相关产品推荐
相关产品推荐

