Поскольку вы накладываете ограничения на три узла (т. Е. Дно не ограничено версией, его родитель ограничен платформой, а родительский узел платформы ограничен плагином), вам нужно сделать трехстороннее присоединиться
SELECT * FROM [nt:unstructured] AS plugin
JOIN [nt:unstructured] AS platform ON ISCHILDNODE(platform,plugin)
JOIN [nt:unstructured] AS version ON ISCHILDNODE(version,platform)
WHERE plugin.idProp = $pluginId
AND platform.nameProp = $platform
AND version.versionProp = $version
Для ясности я использовал idProp
, nameProp
и versionProp
в качестве жестко закодированных имен свойств, но вы можете легко построить строку выражения, используя конкатенацию строк Java. Я также использовал переменные связывания (например, $pluginId
, $platform
и $version
), чтобы вы могли также заменить их на конкатенацию строк Java или использовать механизм связывания переменных JCR:
Session session = ...
String expression = "SELECT * FROM ..."; // as above
String pluginId = ...
String platform = ...
String version = ...
QueryManager queryMgr = session.getWorkspace().getQueryManager();
Query query = queryMgr.createQuery(expression,Query.JCR_SQL2);
query.bindValue("pluginId",pluginId);
query.bindValue("platform",platform);
query.bindValue("version",version);
QueryResult result = query.execute();
IMO, выражение JCR-SQL2 довольно читабельно (возможно, меньше, если вы используете конкатенацию строк Java), но вы можете подумать, что XPath более читабелен. Но это замечательная вещь в системе запросов JCR 2.0, потому что вы можете выбрать тот язык, который лучше всего соответствует потребностям этой части вашего приложения.
Из-за этого и Jackrabbit, и ModeShape (любые другие реализации JCR 2.0?) Планируют поддерживать язык XPath, даже если это было исключено спецификацией JCR 2.0.
И, наконец, ModeShape будет анализировать как запрос XPath, так и запрос JCR-SQL2, перечисленные выше, в одно и то же представление JCR-JQOM, поэтому обработка будет идентичной.
(Отказ от ответственности: я руководитель проекта для ModeShape.)