gpt4 book ai didi

java - 与范围内的空日期进行比较

转载 作者:行者123 更新时间:2023-11-30 07:25:55 25 4
gpt4 key购买 nike

@Document
public class Product extends Item {
private Date onlineDate;

private Date offlineDate;
}

数据

Product {
onlineDate : some date
offlineDate : null
}

下面的查询返回 0 个命中

query.addCriteria(Criteria.where("onlineDate").lte(date).and("offlineDate").gte(date))

但下面的查询返回结果

query.addCriteria(Criteria.where("onlineDate").lte(date))

这是我不允许与空日期进行比较的东西吗?

最佳答案

您基本上需要在结果中包含接受 null 的条件。现在,您要求“大于”提供的日期,而null不是“大于”,因此它被排除。

这意味着添加 $or测试该字段上两种可能条件的条件:

Criteria criteria = Criteria.where("onlinedate").lte(date).orOperator(
Criteria.where("offlinedate").gte(date),
Criteria.where("offlinedate").is(null)
);

Query query = new Query().addCriteria(criteria);

System.out.println(query.getQueryObject());

这会给你:

{ 
"onlinedate" : { "$lte" : date } ,
"$or" : [
{ "offlinedate" : { "$gte" : date } } ,
{ "offlinedate" : null }
]
}

这是更改查询以允许 null 值的正确翻译,但这确实让我认为您对查询的基本想法是不正确的,因为这会返回基本上是 “仍然在线”。这可能就是您想要的,但您可能一直想问一些不同的问题。

如果您实际上正在查找在文档中的两个值“之间”提供的日期值的“所有”文档,那么您将改为“反转”范围表达式以匹配“之间”的文档,然后使用 $nor “反转”结果相反:

Criteria criteria = new Criteria().norOperator(
Criteria.where("onlinedate").gte(date)
.and("offlinedate").lte(date)
);

Query query = new Query().addCriteria(criteria);

System.out.println(query.getQueryObject());

这会产生如下查询:

{
"$nor" : [
{
"onlinedate" : { "$gte" : date },
"offlinedate" : { "$lte" : date }
}
]
}

返回两个日期属性之间的范围“之前”和“之后”的结果,或者“离线”日期为 null 且范围为不是“关闭”。

这取决于您实际想要的结果集,要么包含 null 值来查找“仍然打开”的数据,要么只是“排除范围”来查找而是超出范围的数据。

关于java - 与范围内的空日期进行比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36815043/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com