【问题标题】:How do I do a multi-level properties query in JCR 2.0 SQL2?如何在 JCR 2.0 SQL2 中进行多级属性查询?
【发布时间】:2012-01-17 16:08:57
【问题描述】:

我想做这样的事情,但是在 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();

那么我如何只在该节点下查询呢?

【问题讨论】:

    标签: java jcr jcr-sql2


    【解决方案1】:

    由于你是在三个节点上放置约束(即底部not受版本约束,其父节点受平台约束,平台节点的父节点受插件约束),您需要做一个三通加入:

    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
    

    为了清楚起见,我使用了idPropnamePropversionProp 作为硬编码的属性名称,但是您可以使用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 的项目负责人。)

    【讨论】:

    • 很好的答案,谢谢。我确实发现 XPath 语法更直观、更易读。我想知道他们为什么弃用它。
    • 我不确定它为什么被弃用,因为我没有参与 JSR-283 工作。显然,JCR-SQL2 和 JCR-JQOM 是更优越、更强大、更具表现力的语言。但也许他们不确定所有 JCR XPath 查询都可以转换成 JCR-SQL2 或 JCR-JQOM。
    • 这些语句应该是“INNER JOIN”吗? (基于我在这里找到的语法h2database.com/jcr/grammar.html#join.
    • 根据Section 6.7.5 of the JCR 2.0 specification,语法规则实际上是Join ::= left [JoinType] 'JOIN' right 'ON' JoinCondition,其中JoinType(例如,“INNER”、“LEFT OUTER”或“RIGHT OUTER”)是可选的并且是默认的到“内在”。所以我认为h2database.com/jcr/grammar.html#join 的铁路图是不正确的。
    猜你喜欢
    • 1970-01-01
    • 2018-11-24
    • 1970-01-01
    • 2023-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-11
    相关资源
    最近更新 更多