JCR SQL2查询与动态日期比较

时间:2012-01-11 16:05:43

标签: jackrabbit jcr

我需要查询jcr存储库以查找日期属性(例如jcr:created)比特定日期更年轻的节点。

使用SQL2,我检查“jcr:created> date”就像那样(工作正常):

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

现在是棘手的部分:

还有一个额外的属性声明需要动态添加到jcr:created日期的天数。

假设该属性包含5(天),则查询不应检查“jcr:created> date”,而是“(jcr:created + 5)> date”。包含属性值10的下一个节点应通过“(jcr:created + 10)> date”进行检查。

是否有任何智能/动态操作数可以做到这一点?由于属性是特定于节点的,因此我无法将其静态添加到查询中,但必须读取每个节点的属性。

3 个答案:

答案 0 :(得分:6)

Jackrabbit目前不支持这种动态约束。

我认为现在最好的解决方案是使用固定日期约束运行查询,然后自己显式过滤结果。

另一种解决方案是预先计算" jcr:created + extratime"价值并将其存储在附加财产中。这样的计算可以位于首先创建/更新节点的代码中,也可以将它放在观察监听器中,这样无论节点如何被修改,它都会被触发。

答案 1 :(得分:2)

我需要找到过去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)";

答案 2 :(得分:0)

我在那里找到了食谱: 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