2016-08-08 3 views
0

Мой запрос:MarkLogic PojoRepository поиска диапазон Дата не работает

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), а формат даты по умолчанию - ObjectMapper для PojoRepository.

Смотрите этот пример JSON (обратите внимание на DateFormat по умолчанию 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 
} 
} 

Пожалуйста, помогите, я потерял целый день уже и не могу найти проблему?

ответ

1

На мой взгляд, вы нашли ошибку. То, что вы делаете, ставит меня как правильные вещи, но реализация PojoQueryBuilder не поддерживает это, как вы уже нашли. Как вы можете видеть, PojoRepository проявляет особую осторожность, чтобы сериализовать ваши экземпляры java.util.Date в формате ISO 8601, чтобы их можно индексировать как индекс диапазона 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. использование Джексон аннотаций для удаления вложенного «java.util.Date» объекта и переопределить даты .toString на вашем экземпляре «from», поэтому он сериализуется в формате 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 Джексона, поэтому он может сериализовать без вложенного «java.util.Date» объект:

public CaseComent { 
    // ... 

    @JsonTypeInfo(use=JsonTypeInfo.Id.NONE, include=JsonTypeInfo.As.EXTERNAL_PROPERTY) 
    public Date getCreatedDate() { 
    // ... 
    } 
} 
+0

Спасибо Сэм, я очень ценю ваш ответ. Мой коллега и я подозревали, что это был вложенный java.util.Date, который вызывал эту проблему, рад, что вы это подтвердили. Я попробую ваши рекомендуемые обходные пути, спасибо! –

+0

Обходной путь был идеальным, спасибо снова Сэму! –

Смежные вопросы