2013-03-01 50 views
2

我需要按asc或dsc顺序依据字段排序结果集。该字段的类型是String并包含用户的名称。现在这些名字是法国的名字。因此,要进行排序基于他们的名字的用户列表,一般我用下面的代码:Hibernate自定义排序和java.text.Collat​​or

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); 

在这种情况下,我有一个从数据库加载,然后我做了soring的users整个列表。

现在下面的代码是休眠在那里我有startIndex:这台FirstResultCriteriamaxResult:这台CriteriaMaxResults和排序:

Criteria criteria = getSessionFactory().getCurrentSession().createCriteria(entityClass); 

if (StringUtils.isNotEmpty(sortField)) { 
    criteria.addOrder(sortOrder ? Order.asc(sortField) : Order.desc(sortField)); 
} 

criteria.setFirstResult(startIndex); 
criteria.setMaxResults(maxResult); 

这里sortFieldfullName这是在法国和sortOrder可以是truefalse

有没有什么方法可以按照自定义的方式进行排序,以便通过Collator完成排序/排序?任何指针都会对我非常有帮助。

我已经看到了一些网站,如:

,他们正在使用ComparatorSet of Assoicated Objects排序,但我怎么能做到这一点,我案件?

这是我User

@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; 
    } 
} 

回答

2

Hibernate不进行排序。数据库确实如此。执行标准查询归结为执行具有order by fullName子句的SQL查询。

因此,请检查数据库的配置,以了解如何指定表或列使用的排序规则。

+0

谢谢你的建议。我们需要在数据库或表级别中指定排序规则。我在下面添加了一个答案,完成了这项工作。再次感谢。 – 2013-03-01 11:12:48

0
ALTER DATABASE adb DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci; 

完成了这项工作。