首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Hibernate定制排序和java.text.Collator

Hibernate定制排序和java.text.Collator
EN

Stack Overflow用户
提问于 2013-03-01 07:28:53
回答 2查看 1.3K关注 0票数 2

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

代码语言:javascript
复制
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列表,然后进行排序。

下面的代码用于hibernate,其中有startIndex:它设置了CriteriaFirstResultmaxResult:它设置了CriteriaMaxResults和顺序:

代码语言:javascript
复制
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可以是true,也可以是false

是否有任何方法以自定义的方式进行排序,以便执行由Collator完成的排序/排序?任何指针都会对我很有帮助。

我见过这样的网站:

  • 文档
  • 使用比较器对Hibernate集进行排序
  • 使用比较器进行Hibernate注释排序

他们使用ComparatorSet of Assoicated Objects进行排序,但在我的情况下,我该如何做呢?

这是我的User

代码语言:javascript
复制
@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;
    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-03-01 08:09:45

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

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

票数 2
EN

Stack Overflow用户

发布于 2013-03-01 11:11:35

代码语言:javascript
复制
ALTER DATABASE adb DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;

做了这份工作。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15152704

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档