Hibernate 中的 Order.asc(<String>) 和 Comparable 接口中的 "compareTo" 行为是否相同?
Is Order.asc(<String>) in Hibernate and "compareTo" in Comparable interface behave same?
我使用 Hibernate 从数据库中检索对象集并使用 Order.asc(studentName) 来保持升序。
我使用 Comparator 手动对对象列表进行排序,如下所示。
class NameComparator implements Comparator<Student>
{
public int compare(Student z1, Student z2)
{
return z1.getName().compareTo(z2.getName());
}
}
Collections.sort(studentList, new NameComparator());
但是这两种情况下返回列表的顺序不一样。
第一行用Hibernate排序,第二行用NameComparator
排序
aaa3, aaa4, bbb5, BBB7, bbb8, BBB8
aaa3, BBB7, BBB8, aaa4, bbb5, bbb8
这是什么原因?
如果您使用Order.asc(studentName)
,那么您的数据会在数据库中排序。然而 NameComparator
对 Java 应用程序中的数据进行排序。这两个系统不太可能对字符串使用相同的排序。
大多数数据库使用不区分大小写的排序,而 Java 的 compareTo
区分大小写。此外,大多数数据库都有复杂的重音排序机制(重音字母 à 在排序中将接近字母 "a" ),空格,连字符,数字等差异很大来自 Java 的默认排序。最后,语言和地区设置会影响排序顺序。
即使可以在数据库中配置排序并在 Java 中以不同的方式实现,也很难得出匹配的行为。您最好对数据库中的所有内容或 Java 中的所有内容进行排序。大数据时优先选择前者
我使用 Hibernate 从数据库中检索对象集并使用 Order.asc(studentName) 来保持升序。 我使用 Comparator 手动对对象列表进行排序,如下所示。
class NameComparator implements Comparator<Student>
{
public int compare(Student z1, Student z2)
{
return z1.getName().compareTo(z2.getName());
}
}
Collections.sort(studentList, new NameComparator());
但是这两种情况下返回列表的顺序不一样。
第一行用Hibernate排序,第二行用NameComparator
aaa3, aaa4, bbb5, BBB7, bbb8, BBB8
aaa3, BBB7, BBB8, aaa4, bbb5, bbb8
这是什么原因?
如果您使用Order.asc(studentName)
,那么您的数据会在数据库中排序。然而 NameComparator
对 Java 应用程序中的数据进行排序。这两个系统不太可能对字符串使用相同的排序。
大多数数据库使用不区分大小写的排序,而 Java 的 compareTo
区分大小写。此外,大多数数据库都有复杂的重音排序机制(重音字母 à 在排序中将接近字母 "a" ),空格,连字符,数字等差异很大来自 Java 的默认排序。最后,语言和地区设置会影响排序顺序。
即使可以在数据库中配置排序并在 Java 中以不同的方式实现,也很难得出匹配的行为。您最好对数据库中的所有内容或 Java 中的所有内容进行排序。大数据时优先选择前者