4

我正在尝试通过以下查询查询给定节点类型的子树:

SELECT * FROM [my:Type] AS my WHERE PATH(my) LIKE '/content/subtree/%'

不知何故,它没有给出任何结果——使用 ISDESCENDANTNODE 有效——但是一旦我的元素总数超过 5k,查询性能就会很糟糕——无论是在我的子树内部还是外部。

4

2 回答 2

8

我认为这PATH(my)不是有效的JCR SQLJCR 2.0 SQL-2语法。您应该使用 SQL-2:

select * from [my:Type] where isdescendantnode('/content/subtree')

或 XPath

/jcr:root/content//element(*, my:Type)

这可能会很慢,因为它只会使用节点类型上的索引(路径没有索引)。如果您需要它更快,您可以(例如)将路径存储为属性,然后添加相应的条件;但是,这将阻止快速移动操作。

于 2013-04-03T14:01:31.530 回答
1

如果您使用 SQL2,只需像这样更正您的查询

SELECT * FROM [my:type] WHERE PATH([my:type]) LIKE '/content/subtree/%'

对于 SQL,您应该使用:

SELECT * FROM my:Type WHERE jcr:path like '/content/subtree/%'

此查询将搜索“/content/subtree/”下所有级别的所有节点,但如果您只需要在“子树”下搜索一个级别,则应在查询中添加另一个选项以提高性能:

SELECT * FROM my:Type WHERE jcr:path like '/content/subtree/%' and not jcr:path like 'content/subtree/%/%'

您可以在此处找到更多详细信息:http: //docs.jboss.org/exojcr/1.12.13-GA/developer/en-US/html/ch-jcr-query-usecases.html#JCR.ChildNodeConstraint

于 2014-03-19T02:16:33.663 回答