Как сделать многоуровневый запрос свойств в JCR 2.0 SQL2? - PullRequest
0 голосов
/ 17 января 2012

Я хочу сделать что-то подобное, но в JCR_SQL2 (поскольку XPATH в JCR 2.0 устарела).

    QueryManager queryManager = session.getWorkspace().getQueryManager();
    String queryExpression = 
        NodeNames.PLUGIN.jcrName()+"[@"+NodeProps.ID.jcrName()+"='"+pluginId+"']"
        +"/"+
        NodeNames.PLATFORM.jcrName()+"[@"+NodeProps.NAME.jcrName()+"='"+platform+"']"
        +"/"+
        NodeNames.VERSION.jcrName()+"[@"+NodeProps.VERSION.jcrName()+"='"+version+"']";
    query = queryManager.createQuery( queryExpression, Query.XPATH);
    return query.execute().getNodes().nextNode();

Я могу получить первый узел следующим образом:

    Query query = queryManager.createQuery(
            "select * from [nt:unstructured] as p where p.["+NodeProps.ID.jcrName()
            +"] = '"+pluginId+"'", Query.JCR_SQL2);
    Node pluginNode = query.execute().getNodes().nextNode();

Но тогда как мне запросить только под этим узлом?

1 Ответ

4 голосов
/ 18 января 2012

Поскольку вы накладываете ограничения на три узла (т. Е. Дно не ограничено версией, его родитель ограничен платформой, а родительский узел платформы ограничен плагином), вам нужно сделать трехстороннее присоединиться

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.)

...