2012-02-20 58 views
1

我正在构建一个jcr查询并从存储库接收数据。这里是我的代码:jcr查询构造

String queryString = "SELECT * FROM public:hours"; 

try { 
    // get session 
    Session session = requestContext.getSession(); 

    // create query from queryString constructed 
    Query q = session.getWorkspace().getQueryManager().createQuery(queryString, Query.JCR_SQL2); 

    // execute query and retrieve result 
    QueryResult result = q.execute(); 


    // debug line 
    log.error("query is", q.getStatement()); 
.... 

但这不能成功执行。它给了我一个错误,

Repositorty Failed: 
[INFO] [talledLocalContainer] javax.jcr.query.InvalidQueryException: Query: 
[INFO] [talledLocalContainer] SELECT * FROM public:(*)hours; expected: <end> 

在JCR-shell时,如果我在query sql "select * from public:hours"类型,而且给我正确的结果有效。
我搜索了很多参考文献,但几乎每个例子都与我的相同。所以我不确定问题出在哪里。 任何人都有这方面的经验,请帮助。

回答

4

如果您使用的JCR-SQL2查询语言,那么你应该用方括号引用选择名称:

SELECT * FROM [public:hours] 

有关详细信息,请参阅JSR-283(又名,JCR 2.0的第6.7.4节)规格,这也是可用的online。请注意,如果名称是有效的SQL92标识符,则不需要方括号引号字符。包含名称空间前缀的节点类型名称始终需要加引号,因为SQL92标识符中不允许使用':'字符。

当然,这里假定您有一个名为“public:hours”的节点类型,其中“public”是命名空间前缀。

+0

嗨@Randall感谢您的回答! (注意,我可以使用'query sql'select * from public:hours“')
请注意我的代码中的最后一行,它是' log.error(“query is”,q.getStatement());'它给了我一个'查询语句是'的结果,没有任何结果。所以我想知道我仍然没有正确构建查询?谢谢 – 2012-02-21 02:19:05