具有动态日期比较的 JCR SQL2 查询

Posted

技术标签:

【中文标题】具有动态日期比较的 JCR SQL2 查询【英文标题】:JCR SQL2 query with dynamic date comparison 【发布时间】:2012-02-07 23:58:52 【问题描述】:

我需要查询 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”检查。

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

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

感谢您的澄清回答并确认我的假设。 也许它是新的,但它不再准确,请参阅:***.com/a/22356073/2087666【参考方案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)";

【讨论】:

【参考方案3】:

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

【讨论】:

以上是关于具有动态日期比较的 JCR SQL2 查询的主要内容,如果未能解决你的问题,请参考以下文章

Magnolia JCR-SQL2 按日期排序

使用 Querybuilder 从全文搜索父路径中排除子路径或从 XPATH/JCR SQL2 查询中获取搜索命中摘录

比较 JPA Criteria API 中的日期实体

具有 Power Query 日期的动态 SQL 查询

将选定日期与表列或 MySQL 查询生成的日期数组进行比较

比较日期查询的性能