2012-01-11 42 views
4

日付プロパティ(jcr:createdなど)が特定の日付よりも若いノードを見つけるためにjcrリポジトリにクエリを実行する必要があります。 (正常に動作します)そのような "作成>日付JCR":今動的日付比較を使用するJCR SQL2クエリ

SELECT * FROM [nt:base] AS s WHERE s.[jcr:created] > CAST('2012-01-05T00:00:00.000Z' AS DATE)

トリッキーな部分:

宣言し、追加のプロパティがありますSQL2を使用して

、私がチェックを行いますjcr:created dateに動的に追加する必要のある日数。

プロパティに5日が含まれているとすると、クエリでは「jcr:created> date」ではなく「(jcr:created + 5)> date」にチェックする必要があります。プロパティ値10を含む次のノードは、 "(jcr:created + 10)> date"でチェックする必要があります。

これを実行できるインテリジェント/ダイナミックなオペランドはありますか?プロパティはノード固有であるため、静的にクエリに追加することはできませんが、各ノードのプロパティを読み取る必要があります。

答えて

6

現在、Jackrabbitはこのような動的制約をサポートしていません。

私は今、最良の解決策は、固定日付制約を使用してクエリを実行し、結果を自分で明示的にフィルタリングすることだと考えています。

"jcr:created + extratime"の値を事前に計算し、それを追加のプロパティに格納する方法もあります。そのような計算は、最初にノードを作成/更新するコード内に置くか、ノードをどのように変更しているかに関係なくトリガーされるように観測リスナーに配置することができます。

+0

おかげで、私の仮定を確認しました。 –

+0

新しいかもしれませんが、正確ではありません。http://stackoverflow.com/a/22356073/2087666 –

1

私はそれを必要とするかもしれない他の人のために貼り付け、CAST関数内で有効な日付を取得するにはどのように苦労していた最後の12時間

で作成されたドキュメントを見つける必要がありました。

SimpleDateFormat dateFromat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"); 
cal.setTime(cal.getTime()); 
cal.add(Calendar.HOUR, -12); 

String queryString = "SELECT * FROM [nt:base] AS s WHERE " 
      + "ISDESCENDANTNODE([/content/en/documents/]) " 
      + "and s.[jcr:created] >= CAST('"+dateFromat.format(cal.getTime())+"' AS DATE)"; 
0

私はそこreceipeが見つかりました: test.sql2.txt

テストのリストを。以下のような私のクエリを見て:

SELECT * FROM [nt:base] where [jcr:created] > cast('+2012-01-01T00:00:00.000Z' as date) 

は、キャスト文字列内のすべてが必要です:明確な答えのための+yyyy-MM-ddT00:00:00.000Z