QueryDSL - 当日期为空时避免 NPE
QueryDSL - Avoid NPE when date is null
我有一个包含以下 where
子句的查询:
.where(table.lastupdated.after(date))
其中 date
只是一个时间戳。但是,date
可以是 null
。如果我通过 null
日期,我将获得 NPE。我怎样才能避免这种情况?
在 date
为 null
的情况下,我希望查询像上面的 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 次不同的查询。
我有一个包含以下 where
子句的查询:
.where(table.lastupdated.after(date))
其中 date
只是一个时间戳。但是,date
可以是 null
。如果我通过 null
日期,我将获得 NPE。我怎样才能避免这种情况?
在 date
为 null
的情况下,我希望查询像上面的 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 次不同的查询。