2013-11-24 28 views
0

在我的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

回答

0

最后,我做了一些解决这个问题的方法。这就是它。

就我而言,第一部分本质上是一个整数。 因此,我为我的实体中的号码创建了2个字段。 number as Integer and subNumber as String。

@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,子编号= A

6/7 =号码:6,子编号=/7

而且,你会得到正确的顺序了。

即使您的问题情况有点不同,您也可以通过制作两个字段来应用相同的逻辑 。这是非常容易的,然后定制HQL或本机SQL,不要 知道性能。

+0

我喜欢把它分成两个领域的想法,因为它应该是最充分的对于门牌号码(所以我们不会像4/7和4/10这样的值出现在一起:P)由于这两个字段主要是为DB排序目的而存储的,所以我建议在'@ PrePersist'中处理它,所以设计不需要改变太多(OP可能会在更改House的工厂方法时遇到问题) –

+0

那么,我不知道@PrePersist或它的作用。正如我所说,这是一个解决方法。无论如何,我会寻找它。什么是OP? – Akshat

+0

OP表示原创海报:) –

-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`) 
+0

不,它是给出相同的顺序,下面的一个。而且,我在hibernate中这样做,所以我在字段中使用了@OrderBy(clause =“houseNumber”)。 – Akshat

+0

你有你的解决方案?事情是你必须定义你的houseNumber列作为varchar,这是解决 –

+0

它已经是varchar。 – Akshat

0

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