我们在 JCR 中有几个节点应该在午夜进行版本控制。当然,我们只想在该节点自上次版本化后发生更改时创建一个新版本。有没有办法在不获取所有节点的情况下获取所有具有未版本更改的节点,迭代它们并将最后更改的时间戳与最新版本进行比较?
1 回答
JCR 2.0 包含一个内置的标准 mixin,mix:lastModified
其定义如下:
[mix:lastModified] mixin
- jcr:lastModified (date)
- jcr:lastModifiedBy (string)
要使用它,只需使用 将其作为 mixin 添加到节点中Node.addMixin("mix:lastModified")
,或者如果您使用的是自定义节点类型,只需更改自定义节点类型即可扩展它。当您更改其中一个节点时,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
节点类型中可见。