gpt4 book ai didi

java - 如何在 JCR 2.0 SQL2 中进行多级属性查询?

转载 作者:行者123 更新时间:2023-12-01 19:09:05 24 4
gpt4 key购买 nike

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

但是我如何只在该节点下查询呢?

最佳答案

由于您要对三个节点施加约束(即底部节点不受版本约束,其父级受平台约束,平台节点的父级受插件约束),因此您需要执行三向加入:

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 字符串连接很容易。我还使用了绑定(bind)变量(例如,$pluginId$platform$version),您也可以将它们替换为 Java 字符串连接或使用JCR的绑定(bind)变量机制:

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 的项目负责人。)

关于java - 如何在 JCR 2.0 SQL2 中进行多级属性查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8897869/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com