在我的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 :(得分: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`)