控制Hibernate EnumType.STRING属性的排序顺序

当前,我的项目使用@Enumerated(EnumType.ORDINAL),因此当我按此列排序时,它是根据中的顺序进行排序的enum,效果很好。但是我需要在中添加一些enum附加值,这些附加值需要插入到枚举值列表中的不同位置,并且不能仅仅添加到底部以保持正确的排序顺序。

如果这样做,我的数据库将会混乱。我将不得不编写一些脚本来将所有这些序数值转换为正确的新序数。有可能以后必须添加更多状态。由于必须修复数据库中的所有数据,因此只需要执行一次,因为这将是一项艰巨的任务。

因此,我正在考虑切换为EnumType.STRING不必再次重新映射数据库中的序数值。但是,如果我这样做,该如何正确排序?枚举字符串的字母顺序不是我需要的顺序。

使用下面的类,当我按属性“状态”排序时,结果按此顺序显示:

hql = "from Project order by status"

Development

Planning

Production

我希望它们按此顺序出现,而不使用EnumType.ORDINAL

Planning

Development

Production

无需为创建表格enum或为Project该类添加其他列,是否可以实现?我已经尝试过了,但是抛出了一个异常:

hql = "from Project order by status.sort"

枚举:

public enum Status {

PLANNING("Planning", 0),

DEVELOPMENT("Development", 1),

PRODUCTION("Production", 2);

private final String name;

private final int sort;

private Status(String name, int sort) {

this.name = name;

this.sort = sort;

}

@Override

public String toString() {

return name;

}

}

实体:

@Entity

public class Project {

private Long id;

private Status status;

@Id

@GeneratedValue

public Long getId() {

return this.id;

}

private void setId(Long id) {

this.id = id;

}

@Enumerated(EnumType.STRING)

public Status getStatus() {

return status;

}

public void setStatus(Status status) {

this.status = status;

}

}

回答:

因此,我正在考虑切换到EnumType.STRING,而不必再次重新映射数据库中的序数值。但是,如果我这样做,该如何正确排序?枚举字符串的字母顺序不是我需要的顺序。

我个人完全避免使用邪恶,EnumType.ORDINAL因为仅更改常量的顺序会破坏持久性逻辑。邪恶。话虽如此,EnumType.STRING确实并不总是适当的。

在您的情况下,这就是我要执行的操作(使用标准JPA):我将int在实体级别上坚持并在getter /

setter中执行枚举转换。这样的东西。首先,枚举:

public enum Status {

PLANNING("Planning", 100),

DEVELOPMENT("Development", 200),

PRODUCTION("Production", 300);

private final String label;

private final int code;

private Status(String label, int code) {

this.label = label;

this.code = code;

}

public int getCode() { return this.code; }

private static final Map<Integer,Status> map;

static {

map = new HashMap<Integer,Status>();

for (Status v : Status.values()) {

map.put(v.code, v);

}

}

public static Status parse(int i) {

return map.get(i);

}

}

因此,基本上,这个主意是能够通过获得Statuscode。并且我们在常量之间保留一些空间,以便可以添加值(虽然它不是很漂亮,但是,它将起作用并且应该在一段时间内是安全的)。

然后在实体中:

@Entity

public class Project {

private Long id;

private int statusCode;

@Id @GeneratedValue

public Long getId() {

return this.id;

}

private void setId(Long id) {

this.id = id;

}

@Transient

public Status getStatus () {

return Status.parse(this.statusCode);

}

public void setStatus(Status status) {

this.statusCode = status.getCode();

}

protected int getStatusCode() {

return statusCode;

}

protected void setStatusCode(int statusCode) {

this.statusCode = statusCode;

}

}

int表示的获取器/设置器受到保护。公共获取者/设置者处理转换。

另一种解决方案是使用自定义类型(以可移植性为代价)。

以上是 控制Hibernate EnumType.STRING属性的排序顺序 的全部内容, 来源链接: utcz.com/qa/413063.html

回到顶部