gpt4 book ai didi

java - "order by"基于表达式

转载 作者:行者123 更新时间:2023-11-29 08:50:50 25 4
gpt4 key购买 nike

给定一个比较器:

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 查询(或 SQL2,如果它超出 xpath 的功能)通过“order by”获得相同的结果。可能吗?

给定数据:

No. |  Name    | Nickname |
1 | Adam | Hornet |
2. | Adam | |
3. | Jack | Legend |

排序数据:

No. | name | nickname
2. | Adam |
1. | Adam | Hornet
3. | Jack | Legend

最佳答案

下面是如何使用比较器中的任意代码执行此操作的草图。以执行普通查询得到的 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属性添加defaulting。

关于java - "order by"基于表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22780347/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com