最后,我做了一些解决这个问题的方法。这就是它。
就我而言,第一部分本质上是一个整数。 因此,我为我的实体中的号码创建了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表示原创海报:) –