QueryDSL - 当日期为空时避免 NPE

QueryDSL - Avoid NPE when date is null

我有一个包含以下 where 子句的查询:

.where(table.lastupdated.after(date))

其中 date 只是一个时间戳。但是,date 可以是 null。如果我通过 null 日期,我将获得 NPE。我怎样才能避免这种情况?

datenull 的情况下,我希望查询像上面的 where 子句不存在一样执行。换句话说,要查询整个 table 而不管 lastupdated 字段。

查询相当大,我不想创建两个查询(一个有日期检查,另一个没有)。我正在寻找更简洁的内容。

您唯一的选择是在 Java 中自己处理 null

if (date != null) {
    query.where(table.lastUpdated.after(date);
}

问题是 Java null 不等同于 SQL NULL。例如,WHERE lastUpdated > null 将在 SQL 中 return 一个空结果集,因为针对 NULL 的任何操作都会产生 NULL,而这本身就是错误的。

QueryDSL 通过强制用户实现他们自己的空值处理来防止这种意外行为。如果您在查询中确实需要一个空表达式,那么您应该使用 Expressions.nullExpression().

您可以先构建查询,然后再执行。

if (date != null) {
    query = query.where(table.lastUpdated.after(date));
}

repository.findOne(query);

无需进行 2 次不同的查询。