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,我们会立即修复它。同时,这里有两个解决方法:

  1. 使用数字日期值和数字范围索引
  2. 使用 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() {
    // ...
  }
}