如何在 Apache Jackrabbit 上运行查询,举例说明
Posted
技术标签:
【中文标题】如何在 Apache Jackrabbit 上运行查询,举例说明【英文标题】:How to run query on Apache Jackrabbit, explain with example 【发布时间】:2013-05-17 21:11:35 【问题描述】:我正在使用 Apache Jackrabbit 作为数据库。
In my case, root node has numbers of child nodes(only at depth 1).
All child node has unique name, i.e., some Integer.
Each child Node have some properties that I have used further.
我的任务
我必须选取键(整数值)最小的前 10 个节点。
我的想法
为了实现上述目标,我进行了一个查询,对所有子节点的键进行排序,然后选择前 10 个。然后通过使用这些键,我得到所有对应的节点,并在工作后删除所有键/值对。
为此,我在互联网上搜索了很多如何运行查询。你能告诉我如何在 apache jackrabit 上运行查询吗?很好,如果你用例子来解释。
编辑编号。 1
公共类 JackRabbit
public static void main(String[] args) throws Exception
try
Repository repository = JcrUtils.getRepository("http://localhost:4502/crx/server");
javax.jcr.Session session = repository.login(new SimpleCredentials("admin", "admin".toCharArray()));
Node root = session.getRootNode();
// Obtain the query manager for the session via the workspace ...
javax.jcr.query.QueryManager queryManager = session.getWorkspace().getQueryManager();
// Create a query object ...
String expression = "select * from nt:base where name= '12345' ";
javax.jcr.query.Query query = queryManager.createQuery(expression, javax.jcr.query.Query.JCR_SQL2);
// Execute the query and get the results ...
javax.jcr.query.QueryResult result = query.execute();
session.logout();
catch (Exception e)
e.printStackTrace();
例外
javax.jcr.query.InvalidQueryException: Query:
select * from nt:(*)base where name= '12345'; expected: <end>
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:525)
at org.apache.jackrabbit.spi2dav.ExceptionConverter.generate(ExceptionConverter.java:69)
at org.apache.jackrabbit.spi2dav.ExceptionConverter.generate(ExceptionConverter.java:51)
at org.apache.jackrabbit.spi2dav.ExceptionConverter.generate(ExceptionConverter.java:45)
at org.apache.jackrabbit.spi2dav.RepositoryServiceImpl.executeQuery(RepositoryServiceImpl.java:2004)
at org.apache.jackrabbit.jcr2spi.WorkspaceManager.executeQuery(WorkspaceManager.java:349)
at org.apache.jackrabbit.jcr2spi.query.QueryImpl.execute(QueryImpl.java:149)
at jackrabbit.JackRabbit.main(JackRabbit.java:36)
我想写一个如下场景的查询
这里具有整数值的节点具有一些属性。我想按它们的整数值对这些节点进行排序,并提取前 50 个节点进行进一步处理。
帮助我。
【问题讨论】:
【参考方案1】:我希望这将帮助您执行查询:
public FolderListReturn listFolder(String parentNode, String userid,String password)
System.out.println("getting folders and files from = "+parentNode+" of user : "+userid);
SessionWrapper sessions =JcrRepositoryUtils.login(userid, password);
Session jcrsession = sessions.getSession();
Assert.notNull(name);
FolderListReturn folderList1 = new FolderListReturn();
ArrayOfFolders folders = new ArrayOfFolders();
try
javax.jcr.query.QueryManager queryManager;
queryManager = jcrsession.getWorkspace().getQueryManager();
String expression = "select * from [nt:folder] AS s WHERE ISCHILDNODE(s,'"+name+"')and CONTAINS(s.[edms:owner],'*"+userid+"*') ORDER BY s.["+Config.EDMS_Sorting_Parameter+"] ASC";
javax.jcr.query.Query query = queryManager.createQuery(expression, javax.jcr.query.Query.JCR_SQL2);
javax.jcr.query.QueryResult result = query.execute();
for (NodeIterator nit = result.getNodes(); nit.hasNext();)
Node node = nit.nextNode();
Folder folder = new Folder();
folder=setProperties(node,folder,userid,password,jcrsession,name);
folders.getFolderList().add(folder);
folderList1.setFolderListResult(folders);
folderList1.setSuccess(true);
catch (Exception e)
e.printStackTrace();
finally
//JcrRepositoryUtils.logout(sessionId);
return folderList1;
【讨论】:
【参考方案2】:您应该在 JCR-SQL2 中引用您的节点类型名称:
select * from [nt:base]
这是JCR-SQL 和JCR-SQL2 之间的主要区别之一。此外,name
是一个带有选择器参数的dynamic operand。因此,编写查询的更好方法是:
select * from [nt:base] as b where name(b) = '12345'
【讨论】:
对我来说 - 使用 jackrabbit -name(b)
会抛出 javax.jcr.UnsupportedRepositoryOperationException
... 但使用 localname(b)
可以正常工作。
@kevinjansz:嗯,可能是。已经有一段时间了,我还没有真正接触过 JCR,因为......所以我担心我不会有任何帮助【参考方案3】:
根据您要使用的query language,您有不同的查询执行方式。
查看this code,了解一些仅使用 API 而不是 SQL 之类的字符串查询的简单查询。 您也可以查看 JBoss Modeshape documentation 的示例,因为它是另一个 JCR 2.0 实现。
【讨论】:
我编写了一个代码,但它引发了一个错误,即 Query 错误。请帮助我使它正确。见编辑号。 1以上是关于如何在 Apache Jackrabbit 上运行查询,举例说明的主要内容,如果未能解决你的问题,请参考以下文章
Apache Jackrabbit 和 Jackrabbit Oak 有啥区别?
如何学习使用内容存储库和 Apache JackRabbit?
apache jackrabbit 实现 webdav 客户端怎么设置主体
apache jackrabbit 实现 webdav 客户端怎么设置主体
如何将数据从 Magnolia CMS Apache Jackrabbit 内容存储库迁移到普通 SQL SERVER 数据库