Hibernate自定义排序和java.text.Collator
我需要根据字段按asc或dsc顺序对结果集进行排序。该字段的类型为String,包含用户名。现在这些名字是法国名字。因此,为了根据用户的姓名对用户列表进行排序,我通常使用以下代码:Hibernate自定义排序和java.text.Collator,java,hibernate,sorting,hibernate-4.x,Java,Hibernate,Sorting,Hibernate 4.x,我需要根据字段按asc或dsc顺序对结果集进行排序。该字段的类型为String,包含用户名。现在这些名字是法国名字。因此,为了根据用户的姓名对用户列表进行排序,我通常使用以下代码: final Collator collator = Collator.getInstance(Locale.FRANCE); Comparator<ActivityUserDTO> comparator = new Comparator<ActivityUserDTO>() { @
final Collator collator = Collator.getInstance(Locale.FRANCE);
Comparator<ActivityUserDTO> comparator = new Comparator<ActivityUserDTO>() {
@Override
public int compare(ActivityUserDTO dto1, ActivityUserDTO dto2) {
return collator.compare(dto1.getFullName(), dto2.getFullName());
}
};
Collections.sort(users, comparator);
这里的sortField
是法语的fullName
,sortOrder
可以是true
或false
有没有办法以定制的方式进行排序,这样它就可以进行排序/排序,而排序/排序是由Collator
完成的?任何指针都会对我很有帮助
我看过一些网站,如:
比较器
对关联对象集
进行排序,但在我的情况下如何进行排序
这是我的用户
:
@javax.persistence.Entity
@Table(name = "USER")
public class User extends Entity {
@Transient
private static final long serialVersionUID = -112950002831333869L;
private String username;
private String firstName;
private String lastName;
private String fullName;
private String mail;
private String homePostalAddress;
private String mobile;
private String homePhone;
private Date dateOfBirth;
private Date dateOfJoining;
private Date dateOfRelease;
private boolean active;
private String role;
private Set<Activity> activities;
public User() {
super();
}
@NaturalId
@Column(name = "USERNAME", nullable = false)
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
@Column(name = "FIRST_NAME")
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
@Column(name = "LAST_NAME")
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
@Column(name = "FULL_NAME")
public String getFullName() {
return fullName;
}
public void setFullName(String fullName) {
this.fullName = fullName;
}
@Column(name = "MAIL")
public String getMail() {
return mail;
}
public void setMail(String mail) {
this.mail = mail;
}
@Column(name = "HOME_POSTAL_ADDRESS")
public String getHomePostalAddress() {
return homePostalAddress;
}
public void setHomePostalAddress(String homePostalAddress) {
this.homePostalAddress = homePostalAddress;
}
@Column(name = "MOBILE")
public String getMobile() {
return mobile;
}
public void setMobile(String mobile) {
this.mobile = mobile;
}
@Column(name = "HOME_PHONE")
public String getHomePhone() {
return homePhone;
}
public void setHomePhone(String homePhone) {
this.homePhone = homePhone;
}
@Column(name = "DATE_OF_BIRTH")
public Date getDateOfBirth() {
return dateOfBirth;
}
public void setDateOfBirth(Date dateOfBirth) {
this.dateOfBirth = dateOfBirth;
}
@Column(name = "DATE_OF_JOINING")
public Date getDateOfJoining() {
return dateOfJoining;
}
public void setDateOfJoining(Date dateOfJoining) {
this.dateOfJoining = dateOfJoining;
}
@Column(name = "DATE_OF_RELEASE")
public Date getDateOfRelease() {
return dateOfRelease;
}
public void setDateOfRelease(Date dateOfRelease) {
this.dateOfRelease = dateOfRelease;
}
@Column(name = "ACTIVE", nullable = false)
public boolean isActive() {
return active;
}
public void setActive(boolean active) {
this.active = active;
}
@Column(name = "ROLE")
public String getRole() {
return role;
}
public void setRole(String role) {
this.role = role;
}
@ManyToMany(cascade = { CascadeType.ALL }, mappedBy = "users", targetEntity = Activity.class)
public Set<Activity> getActivities() {
return activities;
}
public void setActivities(Set<Activity> activities) {
this.activities = activities;
}
}
@javax.persistence.Entity
@表(name=“USER”)
公共类用户扩展实体{
@短暂的
私有静态最终长serialVersionUID=-11295000283133869L;
私有字符串用户名;
私有字符串名;
私有字符串lastName;
私有字符串全名;
私人字符串邮件;
私人弦乐家装;
私有字符串移动;
私人电话;
私人出生日期;
加入日期;
私人租赁日期;
私有布尔活动;
私有字符串角色;
私人活动;
公共用户(){
超级();
}
@归化
@列(name=“USERNAME”,null=false)
公共字符串getUsername(){
返回用户名;
}
public void setUsername(字符串用户名){
this.username=用户名;
}
@列(name=“FIRST_name”)
公共字符串getFirstName(){
返回名字;
}
public void setFirstName(字符串firstName){
this.firstName=firstName;
}
@列(name=“LAST_name”)
公共字符串getLastName(){
返回姓氏;
}
public void setLastName(字符串lastName){
this.lastName=lastName;
}
@列(name=“全名”)
公共字符串getFullName(){
返回全名;
}
public void setFullName(字符串fullName){
this.fullName=fullName;
}
@列(name=“MAIL”)
公共字符串getMail(){
回信;
}
公共无效设置邮件(字符串邮件){
this.mail=邮件;
}
@列(name=“家庭\邮政\地址”)
公共字符串getHomePostalAddress(){
返乡邮资;
}
公共无效设置HomePostLaddress(字符串HomePostLaddress){
this.homePostalAddress=homePostalAddress;
}
@列(name=“MOBILE”)
公共字符串getMobile(){
返回手机;
}
公共void setMobile(字符串移动){
this.mobile=mobile;
}
@列(name=“家庭电话”)
公共字符串getHomePhone(){
返回家庭电话;
}
公用void setHomePhone(字符串homePhone){
this.homePhone=homePhone;
}
@列(name=“出生日期”)
公共日期getDateOfBirth(){
出生返回日期;
}
公共无效设置出生日期(出生日期){
this.dateOfBirth=出生日期;
}
@列(name=“加入日期”)
公开日期getDateOfJoining(){
加入的返回日期;
}
公共无效设置加入日期(加入日期){
this.dateOfJoining=加入日期;
}
@列(name=“发布日期”)
公共日期getDateOfree(){
归还日期;
}
公共无效设置释放日期(释放日期){
this.dateOfRelease=释放日期;
}
@列(name=“ACTIVE”,nullable=false)
公共布尔isActive(){
主动返回;
}
public void setActive(布尔激活){
这个.active=active;
}
@列(name=“ROLE”)
公共字符串getRole(){
返回角色;
}
公共void setRole(字符串角色){
this.role=角色;
}
@ManyToMany(cascade={CascadeType.ALL},mappedBy=“users”,targetEntity=Activity.class)
公共集合getActivities(){
返回活动;
}
公共活动(集合活动){
这是活动=活动;
}
}
Hibernate不进行排序。数据库是这样做的。执行一个条件查询归结为执行一个SQL查询,该查询包含一个orderbyfullname
子句
因此,请检查数据库的配置,了解如何指定表或列使用的排序规则
ALTER DATABASE adb DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;
完成了任务。谢谢你的建议。我们需要在数据库或表级别指定排序规则。我在下面添加了一个答案,它完成了任务。再次感谢。
ALTER DATABASE adb DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;