How to run query on Apache Jackrabbit, explain with example

devsda picture devsda · May 22, 2013 · Viewed 9.1k times · Source

I am using Apache Jackrabbit as a database.

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.

My task

I have to take top 10 nodes whose keys(integer values) are minimum.

My thinking

To achieve above goal, I make a query that sorts the keys of all child nodes, and pick top 10. Then by using that keys, I get all corresponding nodes, and after working, delete all that key/value pairs.

For that I searched a lot on the internet how to run the query. Can you please tell me how to run query on apache jackrabit. It is good, if you explain with example.

Edit no. 1

public class 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();
    }
}

}

Exception

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)

I want to write a query of below scenereo

enter image description here

Here nodes having integer value have some properties. I want to sort these nodes by their integer values, and extract top 50 nodes for further processing.

Help me in that.

Answer

Lukas Eder picture Lukas Eder · May 24, 2013

You should quote your node type name in JCR-SQL2:

select * from [nt:base]

This is one of the main differences between JCR-SQL and JCR-SQL2. Besides, name is a dynamic operand taking a selector argument. So a better way to write your query would be this:

select * from [nt:base] as b where name(b) = '12345'