2016-08-08 8 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として)を既に追加しています。日付形式はPojoRepositoryのObjectMapperにデフォルト設定されています。

は、このサンプル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の範囲インデックスとしてインデックスを付けることができます。その作品は良いです。しかし、2つの問題は、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を記録しました。すぐに修正されます。平均時間では、ここでは2つの回避策は以下のとおりです。

  1. は、ネストされた「java.util.Date」オブジェクトを削除し、日付を上書きするジャクソンの注釈を使用し、数値、日付値と数値の範囲のインデックス
  2. を使用しますあなたの "from"インスタンスの.toStringメソッドを使用して、ISO 8601形式でシリアル化します。

最初の回避策は簡単で詳細な説明は不要です2番目の回避策を説明します。

public CaseComent { 
    // ... 

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

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方法であなたはそれをシリアライズすることができますので、ネストされた「java.util.Date」オブジェクトなしJsonTypeInfoジャクソンアノテーションを追加する必要があります

+0

ありがとうSam、本当にありがとうございます。私の同僚と私はこの問題を引き起こしていたjava.util.Dateがネストされていると疑っていました。私はお勧めの回避策、おかげでしようとします! –

+0

回避策は完璧でした、もう一度サムに感謝! –