2012-01-11 2 views
4

Мне нужно запросить репозиторий jcr, чтобы найти узлы, где свойство date (например, jcr: created) меньше определенной даты.Запрос JCR SQL2 с динамическим сопоставлением дат

Использование SQL2, я чек "JCR: создано> Дата" как это (который прекрасно работает):

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

Теперь сложная часть:

Там в дополнительное свойство, которое объявляет несколько дней, которые нужно добавить в jcr: создать дату динамически.

Предположим, что свойство содержит 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

У меня была необходимость найти документы, созданные в последние 12 часов

У меня было трудное время, как получить корректную дату в функции CAST, Оклейка для других людей, которые, возможно, нуждаются в ней.

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

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