首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >"order by“基于表达式

"order by“基于表达式
EN

Stack Overflow用户
提问于 2014-04-01 16:19:31
回答 2查看 681关注 0票数 2

给出一个比较器:

代码语言:javascript
运行
复制
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 )。有可能吗?

给定数据:

代码语言:javascript
运行
复制
No. |  Name    | Nickname |
 1  |  Adam    | Hornet   |
 2. |  Adam    |          |
 3. |  Jack    | Legend   |

排序后的数据:

代码语言:javascript
运行
复制
No. | name | nickname
2.  | Adam | 
1.  | Adam | Hornet
3.  | Jack | Legend
EN

Stack Overflow用户

发布于 2014-04-01 22:41:10

下面是你如何在你的比较器中使用任意代码来做这件事的草图。获取从执行普通查询获得的NodeIterator

代码语言:javascript
运行
复制
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的方法

代码语言:javascript
运行
复制
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属性中添加默认值。

票数 0
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22780347

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档