最後,我做了一些解決這個問題的方法。這就是它。
就我而言,第一部分本質上是一個整數。 因此,我爲我的實體中的號碼創建了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,不要 知道性能。
我喜歡把它分成兩個領域的想法,因爲它應該是最充分的對於門牌號碼(所以我們不會像4/7和4/10這樣的值出現在一起:P)由於這兩個字段主要是爲DB排序目的而存儲的,所以我建議在'@ PrePersist'中處理它,所以設計不需要改變太多(OP可能會在更改House的工廠方法時遇到問題) –
那麼,我不知道@PrePersist或它的作用。正如我所說,這是一個解決方法。無論如何,我會尋找它。什麼是OP? – Akshat
OP表示原創海報:) –