【问题标题】:Hibernate custom ordering and java.text.CollatorHibernate 自定义排序和 java.text.Collat​​or
【发布时间】:2013-02-15 15:46:38
【问题描述】:

我需要根据字段按 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:它为Criteria 设置FirstResultmaxResult:它设置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);

这里的sortField 是法语的fullNamesortOrder 可以是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;
    }
}

【问题讨论】:

    标签: java hibernate sorting hibernate-4.x


    【解决方案1】:
    ALTER DATABASE adb DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;
    

    完成了任务。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 感谢您的建议。我们需要在数据库或表级别指定排序规则。我在下面添加了一个答案,它完成了这项工作。再次感谢。
      猜你喜欢
      • 2011-10-17
      • 1970-01-01
      • 2016-06-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多