2013-04-02 2 views
2

я пытаюсь запросить поддерево для данного типа узла с помощью этого запроса:JCR запрос по пути

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

как-то это не дает никаких результатов - с помощью ISDESCENDANTNODE работает - но производительность запросов ужасна, как только так как у меня есть> 5k элементов - независимо от того, внутри или вне моего поддерева.

ответ

7

Я не думаю, что PATH(my) действителен JCR SQL или JCR 2.0 SQL-2 грамматика. Вы должны использовать SQL-2:

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

или XPath

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

Это может быть медленным, потому что он будет использовать только индекс от типа узла (путь не индексируется). Если вам нужно, чтобы это было быстрее, вы могли (например) сохранить путь как свойство, а затем добавить соответствующее условие; однако это предотвратит операции быстрого перемещения.

+0

Прекрасно работает! Sweet – Oliver

+0

Хороший ответ: D +1 – Xstian

0

Если вы используете SQL2, просто исправить запрос, как этот

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

Для SQL, вы должны использовать:

SELECT * FROM my:Type WHERE jcr:path like '/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

Смежные вопросы