MarkLogic PojoRepository 搜索范围日期不起作用
MarkLogic PojoRepository search range Dates not working
我的查询:
PojoQueryBuilder<CaseComment> queryBuilder = pojoRepository.getQueryBuilder();
LocalDateTime plusHours = LocalDateTime.now().plusHours(hours); //hours is -24
Date from = Date.from(plusHours.atZone(ZoneId.systemDefault()).toInstant());
PojoQueryDefinition query =
queryBuilder.filteredQuery(
queryBuilder.range("createdDate", Operator.GT, from)
);
PojoPage<CaseComment> results = pojoRepository.search(query,1);
然而,这返回了我所有的评论(24 条记录),而不是过去 24 小时内的评论,这应该只是 3 条记录。我已经添加了 RangePathIndex(作为 dateTime)并且日期格式默认为 PojoRepository 的 ObjectMapper。
查看此示例 JSON(注意日期格式是默认的 ISO):
{
"com.xxx.domain.CaseComment": {
"id": 164,
"createdDate": {
"java.util.Date": "2016-07-27T22:49:00.000Z"
},
"createdBy": "xxx",
"updatedDate": {
"java.util.Date": "2016-07-27T22:49:00.000Z"
},
"updatedBy": "xxx",
"description": "comment",
"caseId": 69
}
}
请帮忙,我已经迷失了一整天,似乎找不到问题所在?
我认为您发现了一个错误。你正在做的事情让我觉得是正确的事情,但是 PojoQueryBuilder 实现不支持,正如你所发现的那样。如您所见,PojoRepository 特别注意以 ISO 8601 格式序列化您的 java.util.Date 实例,以便它们可以作为 MarkLogic 范围索引进行索引。所以这块还是不错的。但是这两个问题是 1) 你的日期有一个嵌套的对象,键是 "java.util.Date",这会阻止你创建一个路径范围索引来匹配你在 "createdDate" 上的查询。这里你的路径范围索引需要是 "com.macquarie.rmg.dawn.casemanager.domain.CaseComment/createdDate/java.util.Date" 但你的查询只是 "com.macquarie.rmg.dawn.casemanager.domain.CaseComment/createdDate".
我已登录 the bug,我们会立即修复它。同时,这里有两个解决方法:
- 使用数字日期值和数字范围索引
- 使用 Jackson 注释删除嵌套的 "java.util.Date" 对象并覆盖 "from" 实例上的 Date.toString 方法,以便它以 ISO 8601 格式序列化。
希望第一个变通方法简单明了,不需要详细解释。我将演示第二种解决方法。
Date from = new java.util.Date() {
public String toString() {
return DatatypeConverter.printDateTime(Calendar.getInstance());
}
};
PojoQueryDefinition query =
queryBuilder.filteredQuery(
queryBuilder.range("createdDate", Operator.GT, from)
);
PojoPage<CaseComment> results = pojoRepository.search(query,1);
然后在您的 com.xxx.domain.CaseComment.getCreatedDate 方法上,您需要添加 JsonTypeInfo jackson 注释,这样它就可以在没有嵌套 "java.util.Date" 对象的情况下进行序列化:
public CaseComent {
// ...
@JsonTypeInfo(use=JsonTypeInfo.Id.NONE, include=JsonTypeInfo.As.EXTERNAL_PROPERTY)
public Date getCreatedDate() {
// ...
}
}
我的查询:
PojoQueryBuilder<CaseComment> queryBuilder = pojoRepository.getQueryBuilder();
LocalDateTime plusHours = LocalDateTime.now().plusHours(hours); //hours is -24
Date from = Date.from(plusHours.atZone(ZoneId.systemDefault()).toInstant());
PojoQueryDefinition query =
queryBuilder.filteredQuery(
queryBuilder.range("createdDate", Operator.GT, from)
);
PojoPage<CaseComment> results = pojoRepository.search(query,1);
然而,这返回了我所有的评论(24 条记录),而不是过去 24 小时内的评论,这应该只是 3 条记录。我已经添加了 RangePathIndex(作为 dateTime)并且日期格式默认为 PojoRepository 的 ObjectMapper。
查看此示例 JSON(注意日期格式是默认的 ISO):
{
"com.xxx.domain.CaseComment": {
"id": 164,
"createdDate": {
"java.util.Date": "2016-07-27T22:49:00.000Z"
},
"createdBy": "xxx",
"updatedDate": {
"java.util.Date": "2016-07-27T22:49:00.000Z"
},
"updatedBy": "xxx",
"description": "comment",
"caseId": 69
}
}
请帮忙,我已经迷失了一整天,似乎找不到问题所在?
我认为您发现了一个错误。你正在做的事情让我觉得是正确的事情,但是 PojoQueryBuilder 实现不支持,正如你所发现的那样。如您所见,PojoRepository 特别注意以 ISO 8601 格式序列化您的 java.util.Date 实例,以便它们可以作为 MarkLogic 范围索引进行索引。所以这块还是不错的。但是这两个问题是 1) 你的日期有一个嵌套的对象,键是 "java.util.Date",这会阻止你创建一个路径范围索引来匹配你在 "createdDate" 上的查询。这里你的路径范围索引需要是 "com.macquarie.rmg.dawn.casemanager.domain.CaseComment/createdDate/java.util.Date" 但你的查询只是 "com.macquarie.rmg.dawn.casemanager.domain.CaseComment/createdDate".
我已登录 the bug,我们会立即修复它。同时,这里有两个解决方法:
- 使用数字日期值和数字范围索引
- 使用 Jackson 注释删除嵌套的 "java.util.Date" 对象并覆盖 "from" 实例上的 Date.toString 方法,以便它以 ISO 8601 格式序列化。
希望第一个变通方法简单明了,不需要详细解释。我将演示第二种解决方法。
Date from = new java.util.Date() {
public String toString() {
return DatatypeConverter.printDateTime(Calendar.getInstance());
}
};
PojoQueryDefinition query =
queryBuilder.filteredQuery(
queryBuilder.range("createdDate", Operator.GT, from)
);
PojoPage<CaseComment> results = pojoRepository.search(query,1);
然后在您的 com.xxx.domain.CaseComment.getCreatedDate 方法上,您需要添加 JsonTypeInfo jackson 注释,这样它就可以在没有嵌套 "java.util.Date" 对象的情况下进行序列化:
public CaseComent {
// ...
@JsonTypeInfo(use=JsonTypeInfo.Id.NONE, include=JsonTypeInfo.As.EXTERNAL_PROPERTY)
public Date getCreatedDate() {
// ...
}
}