我在这个站点找到了这个比较器类。
Hibernate - SortedSet Mappings
但我无法理解它是如何运作的.. 任何想法??
import java.util.Comparator;
public class MyClass implements Comparator<Certificate>{
public int compare(Certificate o1, Certificate o2) {
final int BEFORE = -1;
final int AFTER = 1;
/* To reverse the sorting order, multiple by -1 */
if (o2 == null) {
return BEFORE * -1;
}
Comparable thisCertificate = o1.getName();
Comparable thatCertificate = o2.getName();
if(thisCertificate == null) {
return AFTER * 1;
} else if(thatCertificate == null) {
return BEFORE * -1;
} else {
return thisCertificate.compareTo(thatCertificate) * -1;
}
}
}
答案 0 :(得分:3)
此比较器完全不起作用,因为它违反了Comparator
工作原理的最基本rules。
{p>实现者必须确保所有x和y的sgn(compare(x,y))== -sgn(compare(y,x))
Comparator.compare(x , y) == -Comparator.compare(y,x)
在使用x
时y
或null
为MyClass
时无效。
(这意味着当且仅当compare(y,x)抛出异常时,compare(x,y)必须抛出异常。)
案例o1 == null
根本没有处理,因此会抛出异常,而案例o2 == null
则不会。
这远远不是一个工作的比较器看起来像什么,并且最终可以看作是一个非常难看的黑客。
此Comparator
仅适用于非null
的值。在这种情况下,它只是与自然顺序相反。
答案 1 :(得分:0)
有效吗?在文档中说它正在进行反向排序,
如果我们使用sort =“natural”设置,那么我们不需要创建一个单独的类,因为Certificate类已经实现了Comparable接口,而hibernate将使用Certificate类中定义的compareTo()方法来比较证书名称。但是我们在映射文件中使用自定义比较器类MyClass,因此我们必须根据排序算法创建此类。 让我们使用此类在此课程中进行降序排序。
据我所知,似乎不是真的正确......除非两个证书名称都正确。
public int compare(Certificate o1, Certificate o2) {
final int BEFORE = -1;
final int AFTER = 1;
/* To reverse the sorting order, multiple by -1 */
if (o2 == null) { // if o2 = null > o1 goes first
return BEFORE * -1; // -1 * -1 = 1 so o1 goes first
}
Comparable thisCertificate = o1.getName(); // get o1 name to compare
Comparable thatCertificate = o2.getName(); // get o2 name to compare
if(thisCertificate == null) { // if o1 name is null, o2 goes first
return AFTER * 1; // 1 * 1 = 1 > o1 goes first
} else if(thatCertificate == null) { // if o2 name is null, o1 goes first
return BEFORE * -1; // -1 * -1 = 1 > o1 goes first
} else {
// if both certs names are valid compare them in the usual way
// sorting inversed because of the -1.
return thisCertificate.compareTo(thatCertificate) * -1;
}
}