- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
目前,我的项目使用@Enumerated(EnumType.ORDINAL)
,所以当我按此列排序时,它是根据枚举
中的顺序排序的,这工作正常。但我需要向 enum
添加一些额外的值,这些值需要插入到枚举值列表的不同位置,不能只添加到底部以保持正确的排序顺序。
如果我这样做,我的数据库就会乱七八糟。我将不得不编写一些脚本来将所有这些序数值转换为正确的新序数。有可能以后必须添加更多状态。由于我必须修复数据库中的所有数据,因此我希望只需执行一次,因为这将是一项艰巨的任务。
所以我正在考虑切换到 EnumType.STRING
,这样就不必再次重新映射数据库中的序数值。但是如果我这样做,那么我该如何正确排序呢?枚举字符串的字母顺序不是我需要的顺序。
使用下面的类,当我按属性“status”排序时,结果按以下顺序出现:
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;
}
}
最佳答案
So I'm thinking of switching to EnumType.STRING to not have to remap ordinal values in the database again. But if I do this, then how do I sort properly? The alphabetical order of the enum strings is not the order I need.
我个人完全避免使用邪恶的 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);
}
}
所以基本上,这个想法是能够通过其code
获得Status
。我们在常量之间保留了一些空间,以便可以添加值(这不是很漂亮,但是,它会工作并且在一段时间内应该是安全的)。
然后在实体中:
@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
表示的 getter/setter 受到保护。公共(public) getter/setter 处理转换。
另一种解决方案是使用自定义类型(以可移植性为代价)。
关于java - 控制 Hibernate EnumType.STRING 属性的排序顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3605655/
你能比较一下属性吗 我想禁用文本框“txtName”。有两种方式 使用javascript,txtName.disabled = true 使用 ASP.NET, 哪种方法更好,为什么? 最佳答案 我
Count 属性 返回一个集合或 Dictionary 对象包含的项目数。只读。 object.Count object 可以是“应用于”列表中列出的任何集合或对
CompareMode 属性 设置并返回在 Dictionary 对象中比较字符串关键字的比较模式。 object.CompareMode[ = compare] 参数
Column 属性 只读属性,返回 TextStream 文件中当前字符位置的列号。 object.Column object 通常是 TextStream 对象的名称。
AvailableSpace 属性 返回指定的驱动器或网络共享对于用户的可用空间大小。 object.AvailableSpace object 应为 Drive 
Attributes 属性 设置或返回文件或文件夹的属性。可读写或只读(与属性有关)。 object.Attributes [= newattributes] 参数 object
AtEndOfStream 属性 如果文件指针位于 TextStream 文件末,则返回 True;否则如果不为只读则返回 False。 object.A
AtEndOfLine 属性 TextStream 文件中,如果文件指针指向行末标记,就返回 True;否则如果不是只读则返回 False。 object.AtEn
RootFolder 属性 返回一个 Folder 对象,表示指定驱动器的根文件夹。只读。 object.RootFolder object 应为 Dr
Path 属性 返回指定文件、文件夹或驱动器的路径。 object.Path object 应为 File、Folder 或 Drive 对象的名称。 说明 对于驱动器,路径不包含根目录。
ParentFolder 属性 返回指定文件或文件夹的父文件夹。只读。 object.ParentFolder object 应为 File 或 Folder 对象的名称。 说明 以下代码
Name 属性 设置或返回指定的文件或文件夹的名称。可读写。 object.Name [= newname] 参数 object 必选项。应为 File 或&
Line 属性 只读属性,返回 TextStream 文件中的当前行号。 object.Line object 通常是 TextStream 对象的名称。 说明 文件刚
Key 属性 在 Dictionary 对象中设置 key。 object.Key(key) = newkey 参数 object 必选项。通常是 Dictionary 
Item 属性 设置或返回 Dictionary 对象中指定的 key 对应的 item,或返回集合中基于指定的 key 的&
IsRootFolder 属性 如果指定的文件夹是根文件夹,返回 True;否则返回 False。 object.IsRootFolder object 应为&n
IsReady 属性 如果指定的驱动器就绪,返回 True;否则返回 False。 object.IsReady object 应为 Drive&nbs
FreeSpace 属性 返回指定的驱动器或网络共享对于用户的可用空间大小。只读。 object.FreeSpace object 应为 Drive 对象的名称。
FileSystem 属性 返回指定的驱动器使用的文件系统的类型。 object.FileSystem object 应为 Drive 对象的名称。 说明 可
Files 属性 返回由指定文件夹中所有 File 对象(包括隐藏文件和系统文件)组成的 Files 集合。 object.Files object&n
我是一名优秀的程序员,十分优秀!