0

私はこのようなことをしたいのですが、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();

しかし、そのノードの下だけを照会するにはどうすればよいでしょうか?

4

1 に答える 1

4

3 つのノードに制約を設定しているため (つまり、下のノードはバージョンによって制約され、その親はプラットフォームによって制約され、プラットフォーム ノードの親はプラグインによって制約されます)、3 方向の結合を行う必要があります。

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

わかりやすくするために、ハードコーディングされたプロパティ名として と を使用idPropnamePropましversionPropたが、Java 文字列連結を使用して簡単に式文字列を作成できます。また、これらを Java 文字列連結に置き換えたり、JCR のバインド変数メカニズムを使用したりできるバインド変数 ( 、$pluginId$platformなど) も使用しました。$version

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 のクエリ システムの優れた点です。アプリケーションのその部分のニーズに最適な言語を実際に選択できるからです。

このため、JCR 2.0 仕様で廃止されたにもかかわらず、Jackrabbit と ModeShape (他の JCR 2.0 実装はありますか?) の両方が XPath 言語をサポートする予定です。

そして最後に、ModeShape は上記の XPath クエリと JCR-SQL2 クエリの両方を同じ JCR-JQOM 表現に解析するため、処理は同じになります。

(免責事項: 私は ModeShape のプロジェクト リーダーです。)

于 2012-01-17T20:01:30.787 に答える