【问题标题】:MarkLogic PojoRepository search range Dates not workingMarkLogic PojoRepository 搜索范围日期不起作用
【发布时间】:2016-08-08 05:35:23
【问题描述】:

我的查询:

    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);

但是,这将返回所有 cmets(24 条记录),而不是过去 24 小时内制作的 cmets,它应该只有 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
}
}

请帮忙,我已经迷失了一整天,似乎找不到问题?

【问题讨论】:

    标签: java marklogic


    【解决方案1】:

    在我看来,您发现了一个错误。您正在做的事情让我觉得是正确的事情,但是 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() {
        // ...
      }
    }
    

    【讨论】:

    • 谢谢山姆,非常感谢您的回复。我和我的同事怀疑是嵌套的 java.util.Date 导致了这个问题,很高兴你证实了这一点。我会尝试您推荐的解决方法,谢谢!
    猜你喜欢
    • 2019-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多