【问题标题】:JCR SQL2 query with dynamic date comparison具有动态日期比较的 JCR SQL2 查询
【发布时间】:2023-04-10 17:48:01
【问题描述】:

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

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

【问题讨论】:

    标签: jackrabbit jcr


    【解决方案1】:

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

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

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

    【讨论】:

    【解决方案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

      【讨论】:

        猜你喜欢
        • 2018-11-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-09-16
        • 2020-04-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多