【发布时间】:2014-06-02 07:08:03
【问题描述】:
我们在 JCR 中有几个节点应该在午夜进行版本控制。当然,如果自上次版本化以来此节点发生更改,我们只想创建一个新版本。有没有办法在不获取所有节点的情况下获取所有具有未版本化更改的节点,遍历它们并将最后更改的时间戳与最新版本进行比较?
【问题讨论】:
标签: jakarta-ee jcr modeshape wildfly-8
我们在 JCR 中有几个节点应该在午夜进行版本控制。当然,如果自上次版本化以来此节点发生更改,我们只想创建一个新版本。有没有办法在不获取所有节点的情况下获取所有具有未版本化更改的节点,遍历它们并将最后更改的时间戳与最新版本进行比较?
【问题讨论】:
标签: jakarta-ee jcr modeshape wildfly-8
JCR 2.0 包含一个内置的标准 mixin,mix:lastModified,其定义如下:
[mix:lastModified] mixin
- jcr:lastModified (date)
- jcr:lastModifiedBy (string)
要使用它,只需使用 Node.addMixin("mix:lastModified") 将其作为 mixin 添加到节点中,或者如果您使用自定义节点类型,只需更改自定义节点类型即可扩展它。当您更改其中一个节点时,ModeShape 将在保存时自动更新这两个属性。 (还有一个内置的mix:created 具有jcr:created 和jcr:createdBy 属性,并且以类似的方式工作。)
要查找一段时间后修改的所有节点,请发出查询:
SELECT [jcr:path]
FROM [mix:lastModified] AS node
WHERE [jcr:lastModified] >= CAST('2014-06-01T11:00:00.000' AS DATE)
如果您需要的不仅仅是路径,使用QueryResult.getNodes() 并迭代Node 实例(而不是使用getRows())可能是最简单的。
最后一个查询将查找所有节点,无论类型如何,因此,如果您想查找给定类型的所有节点(例如,acme:dataNode),其中mix:lastModified 添加为 mixin 和自某个日期以来更改了某些属性,您需要使用连接:
SELECT modified.[jcr:path], myNode.[acme:myDataProperty]
FROM [acme:dataNode] AS myNode
JOIN [mix:lastModified] AS modified ON ISSAMENODE(myNode,modified)
WHERE modified.[jcr:lastModified] >= CAST('2014-06-01T11:00:00.000' AS DATE)
另一方面,如果您的自定义节点类型扩展 mix:lastModified,例如:
[acme:customType] > mix:lastModified, mix:versionable
- acme:customProperty (string)
那么您的查询可以更简单一些,并从该节点类型中进行选择(无需连接):
SELECT [jcr:path], [acme:customProperty]
FROM [amce:customType] AS node
WHERE [jcr:lastModified] >= CAST('2014-06-01T11:00:00.000' AS DATE)
毕竟,mix:lastModified 属性在您的自定义类型上可见,因此在 acme:customType 节点类型中可见。
【讨论】: