具有动态日期比较的 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 查询的主要内容,如果未能解决你的问题,请参考以下文章