Hibernate:按字符串字段排序为数字

时间:2013-11-24 06:40:13

标签: java hibernate

在我的Java Hibernate应用程序中, 我有一个字符串列,其值为

1
2
3
4A
4B
5
6/7
8
11
21
31

实际上,这些是殖民地的房屋数量。 并注意像4A,6/7这样的条目,这使得cast as int无法进行排序。

现在,我想完全按照上面的顺序,但我得到以下顺序。

1
11
2
21
3
31
4A
4B
5
6/7
8

我最终想要第11,21,31号地块。

请指导我实现这一目标。 提前致谢:D

4 个答案:

答案 0 :(得分:0)

这里你会遇到一些问题,因为6/7应该在6到7之间不是自动的,而不是67.没有任何HQL知道这一点,所以你必须自己写一些东西。在Hibernate中创建一个formula属性,该属性使用本机SQL将字符串转换为您想要的数字。最简单的方法可能是只接受第一个非数字字符的正则表达式替换。然后你可以对那个属性进行排序。

答案 1 :(得分:0)

最后,我做了一些解决这个问题的工作。就是这样。

就我而言,第一部分基本上是一个整数。 所以,我为我的实体中的数字创建了2个字段。 number为整数,subNumber为字符串。

@Entity
@Table(name = "HOUSE")
public class House {

    .....

    @Column(name = "NUMBER")
    private int number;

    @Column(name = "SUB_NUMBER")
    private String subNumber;

    @ManyToOne
    @JoinColumn(name = "TOWN_ID", nullable = false)
    private Town town;

    .....

    public House(int number, String subNumber) {
        this.number = number;
        this.subNumber = subNumber;
    }

    .....

}

并且,在父类中按如下顺序排序,即Town

@Entity
@Table(name = "TOWN")
public class Town {

    .....

    @OneToMany(mappedBy = "town")
    @OrderBy(clause = "number, subNumber")
    List<House> houses;

    .....

}

现在,从用户那里获得输入。我通过模式匹配将两个部分分开。 如下所示:

public House createHouse(String n) {
    Matcher m = Pattern.compile("(^\\d+)(.*)").matcher(n);

    if(!m.find()) {
        throw new Exception("Number must start with a digit!");
    }

    int number = Integer.parseInt(m.group(1));
    String subNumber = m.group(2);

    return new House(number, subNumber);
}

就是这样。例如:

4A =数字:4,subNumber = A

6/7 =数字:6,subNumber = / 7

而且,你现在会得到正确的订单。

即使您的问题场景略有不同,您也可以应用相同的逻辑 通过制作两个字段。这很容易,然后自定义HQL或本机SQL,不 了解表现。

答案 2 :(得分:0)

这可以通过 2 级排序来解决。

选择* from house where order by length(house_id), house_id;

答案 3 :(得分:-1)

我认为这个查询正在运作

SELECT * FROM orders o ORDER BY o.order 

这是架构

CREATE TABLE `testspring`.`orders`( `id` INT NOT NULL AUTO_INCREMENT ,`order` VARCHAR(255) ,     PRIMARY KEY (`id`)