2011-01-13 50 views
2

我正在使用Jackrabbit,並試圖查詢具有UUID的現有節點。 我的代碼如下所示。問題是referenceNode的UUID的形式是''90be246a-a17c-445e-a5ad-81b064de0bee'「,看起來Jackrabbit(Lucene)中使用的XPATH引擎在處理連字符時存在問題。Jackrabbit針對UUID運行查詢

如果我運行query2,一切都很好,並且referenceNode被打印。 如果我在Eclipse中運行query1(使用UUID),則不返回任何內容。然而,如果我在Jackrabbit Viewer中運行query1,查詢運行良好。

看起來我必須在我的queryString中跳過連字符,但我嘗試添加雙反斜槓並獲得相同的結果。針對UUID運行查詢的正確方法是什麼?

// Set up Nodes 
    rootNode = session.getRootNode(); 

    Node referenceNode = rootNode.addNode("referenceNode"); 
    Node referencingNode = rootNode.addNode("referencingNode"); 

    referenceNode.addMixin("mix:referenceable"); 
    referencingNode.setProperty("pointer", new ReferenceValue(referenceNode)); 

    // Query 
    String uuid = referenceNode.getUUID(); 
    QueryManager qm = ws.getQueryManager(); 

    String queryString1 = "//*[@jcr:uuid='"+uuid+"']"; 
    String queryString2 = "//referenceNode"; 

    Query q = qm.createQuery(queryString1, Query.XPATH); 

    QueryResult result = q.execute(); 

    NodeIterator it = result.getNodes(); 

    while(it.hasNext()) { 
    Node node = it.nextNode(); 
    System.out.println(node.getName()); 
    } 

回答

4

問題可能是該節點尚未保存。如search documentation中所述,「一旦保存數據或提交事務後,立即爲節點名稱和屬性值編制索引。」

在這種情況下,我想你可以使用Session.getNodeByIdentifier(String id)而不是使用查詢。它也應該快得多。

+0

謝謝。我在設置之後和查詢之前添加了一個簡單的session.save(),並且它工作正常。 – Steve 2011-01-13 19:19:35