2

我需要根据字段按 asc 或 dsc 顺序对结果集进行排序。该字段是字符串类型并包含用户名。现在的名字是法国名字。因此,为了根据用户的姓名对用户列表进行排序,我通常使用以下代码:

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

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

现在下面的代码是用于休眠的,我有startIndex: 设置FirstResultfor CriteriamaxResult: 设置MaxResultsofCriteria和排序:

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

这里的sortFieldisfullName是法语,sortOrder可以是trueor false

有没有办法以自定义方式进行排序,以便它进行排序/排序,这是由Collator?任何指针都会对我很有帮助。

我看过一些网站,例如:

他们在哪里Comparator对 进行排序Set 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;
    }
}
4

2 回答 2

2

Hibernate 不进行排序。数据库可以。执行条件查询归结为执行具有order by fullName子句的 SQL 查询。

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

于 2013-03-01T08:09:45.453 回答
0
ALTER DATABASE adb DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;

做了这项工作。

于 2013-03-01T11:11:35.610 回答