提问人:Daniil Spirin 提问时间:10/24/2023 更新时间:10/25/2023 访问量:41
有没有办法在方法(或类似的东西)之间使用 jooq 来处理可为 null 的日期?
Is there a way to use jooq between method(or something similar) to work with nullable dates?
问:
我正在尝试为两个日期(从,到)生成BETWEEN条件。其中之一可以是 null,在这种情况下,我被迫使用 lessThan、greaterThan 而不是 between。还有别的办法吗?
尝试使用标准JooQ的between()方法
答:
0赞
Owais Yosuf
10/25/2023
#1
在 JOOQ 中,可以使用 between 方法为日期创建 BETWEEN 条件,但在处理可为 null 的日期时,需要在查询中处理 null 值。以下是执行此操作的常用方法:
import static org.jooq.impl.DSL.*;
Date from = ...; // Your from date
Date to = ...; // Your to date
// Assuming you have a field "dateField" in your table
Field<Date> dateField = ...;
Condition condition = dateField.between(from, to)
.or(dateField.greaterOrEqual(from).and(dateField.lessOrEqual(to)))
.or(dateField.isNull());
// Now you can use the "condition" in your query
0赞
Lukas Eder
10/25/2023
#2
合成语法有一个待处理的功能请求:BETWEEN UNBOUNDED ON NULL
它将模拟假设的 SQL 语法,如下所示:
a BETWEEN UNBOUNDED ON NULL NULL AND NULL
b BETWEEN UNBOUNDED ON NULL NULL AND 10
c BETWEEN UNBOUNDED ON NULL -10 AND NULL
d BETWEEN UNBOUNDED ON NULL -10 AND 10
大概是大多数人所期望的。在开箱即用之前,您必须按照自己的建议自行实现它,使用某种“最小”和“最大”日期,这些日期永远不会在系统中显示为实际日期,例如
Field<Date> min = inline(Date.valueOf("1970-01-01"));
Field<Date> max = inline(Date.valueOf("9999-12-31"));
Condition c = T.COL.ge(coalesce(from, min)).and(T.COL.le(coalesce(to, max)));
或者,直接在 Java 中实现合并逻辑:
Condition c = T.COL.ge(from != null ? from : min))
.and(T.COL.le(to != null ? to : max));
评论