给出一个比较器:
public int compareTo(Person p1, Person p2)
{
    String val1 = StringUtils.isEmpty(p1.nickName) ? p1.name : p1.nickName;
    String val2 = StringUtils.isBlank(p2.nickName) ? p2.name : p2.nickName;
    return val1.compareTo(val2);
}我希望通过使用xpath查询的"order by“实现相同的结果(如果它超出了xpath的能力范围,则可以使用SQL2 )。有可能吗?
给定数据:
No. |  Name    | Nickname |
 1  |  Adam    | Hornet   |
 2. |  Adam    |          |
 3. |  Jack    | Legend   |排序后的数据:
No. | name | nickname
2.  | Adam | 
1.  | Adam | Hornet
3.  | Jack | Legend发布于 2014-04-01 22:41:10
下面是你如何在你的比较器中使用任意代码来做这件事的草图。获取从执行普通查询获得的NodeIterator:
import javax.jcr.query.Query;
import javax.jcr.query.QueryManager;
import javax.jcr.query.QueryResult;
import javax.jcr.query.NodeIterator;
import org.apache.jackrabbit.commons.iterator.NodeIteratorAdapter;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
. . .
Query query = queryManager.createQuery( /* query without any ordering specs */ );
QueryResult queryResult = query.execute();
NodeIterator nodeIterator = queryResult.getNodes();并将其传递给执行排序并返回另一个NodeIterator的方法
NodeIterator sortedNodes = sortMyWay(nodeIterator);
. . .
private NodeIterator sortMyWay(NodeIterator input) {
    ArrayList<Node> results = new ArrayList<Node>();
    while (input.hasNext()) {
        results.add(input.nextNode());
    }
    Collections.sort(results, new Comparator<Node>(){
        @Override
        public int compare(Node node1, Node node2) {
            String nickName1 = (node1.hasProperty("nickName") ? node1.getProperty("nickName").getString() : "");
            String nickName2 = (node2.hasProperty("nickName") ? node2.getProperty("nickName").getString() : "");
            return nickName1.compareTo(nickName2);
        }
    });
    return new NodeIteratorAdapter(results);
}像往常一样从sortedNodes.nextNode()检索结果。
根据需要在上述方法中添加异常处理,并根据需要在name属性中添加默认值。
https://stackoverflow.com/questions/22780347
复制相似问题