2013-11-24 31 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將字符串轉換爲您想要的數字。最簡單的方法可能是隻接受第一個非數字字符的正則表達式替換。然後你可以對那個屬性進行排序。