如何在Apache Jackrabbit上运行查询,并举例说明

dev*_*sda 5 java database jackrabbit jcr jcr-sql2

我正在使用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.
Run Code Online (Sandbox Code Playgroud)

我的任务

我必须采取其键(整数值)最小的前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();
    }
}
Run Code Online (Sandbox Code Playgroud)

}

例外

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)
Run Code Online (Sandbox Code Playgroud)

我想写一个以下scenereo的查询

在此处输入图片说明

在此,具有整数值的节点具有某些属性。我想通过这些节点的整数值对它们进行排序,并提取前50个节点以进行进一步处理。

帮帮我。

Luk*_*der 5

您应该在 JCR-SQL2 中引用您的节点类型名称:

select * from [nt:base]
Run Code Online (Sandbox Code Playgroud)

这是JCR-SQLJCR-SQL2之间的主要区别之一。此外,name是一个带有选择器参数的动态操作数。因此,编写查询的更好方法是:

select * from [nt:base] as b where name(b) = '12345'
Run Code Online (Sandbox Code Playgroud)


ehs*_*oie 1

根据您要使用的查询语言,您可以采用不同的方式执行查询。

看一下这段代码,了解一些仅使用 API 而不是 SQL 之类的字符串查询的简单查询。您也可以查看JBoss Modeshape 文档中的示例,因为它是另一个 JCR 2.0 实现。