【发布时间】:2018-04-13 14:22:39
【问题描述】:
我有一个 Enum 类,它有一些值。 我们决定从代码中删除其中一个值及其所有实现。 我们不想从数据库中删除任何记录。 我的枚举类是这样的:
public enum CourseType {
VIDEO("CourseType.VIDEO"),
PDF("CourseType.PDF"),
QUIZ("CourseType.QUIZ"),
SURVEY("CourseType.SURVEY"),
POWERPOINT("CourseType.POWERPOINT") //*this one will be removed*
...
}
我的课程实体:
@Entity
@Table(name = "CRS")
public class Course {
@Column(name = "COURSE_TYPE")
@Enumerated(EnumType.STRING)
private CourseType courseType;
@Column(name = "AUTHOR")
private String author;
....
@Override
public CourseType getCourseType() {
return courseType;
}
@Override
public void setCourseType(CourseType courseType) {
this.courseType = courseType;
}
....
}
在我从 Java 类中删除 Powerpoint 类型并尝试从数据库中获取一些值之后, 我收到已删除类型的映射错误。
我有这样的代码:
Course course = courseService.get(id);
如果我在数据库中提供了一个其类型为“POWERPOINT”的课程 ID, 该方法得到以下错误:
java.lang.IllegalArgumentException:未知名称值 [POWERPOINT] 枚举类 [com.tst.enums.CourseType] 在 org.hibernate.type.EnumType$NamedEnumValueMapper.fromName(EnumType.java:461) 在 org.hibernate.type.EnumType$NamedEnumValueMapper.getValue(EnumType.java:449) 在 org.hibernate.type.EnumType.nullSafeGet(EnumType.java:107) 在 org.hibernate.type.CustomType.nullSafeGet(CustomType.java:127) 在 org.hibernate.type.AbstractType.hydrate(AbstractType.java:106) 在 org.hibernate.persister.entity.AbstractEntityPersister.hydrate(AbstractEntityPersister.java:2912) 在 org.hibernate.loader.Loader.loadFromResultSet(Loader.java:1673)
当我尝试从数据库中检索查询结果时,有什么办法吗? 如果该记录的 course_type 列与代码中的任何枚举值不匹配,休眠将不会获取? 我必须使用某种过滤器吗?
【问题讨论】:
-
因此,在您的选择查询中,您应该排除具有已删除
enum值的行。 -
谢谢,但是'courseService.get(id);'不是查询,而是通用方法。此外,我不想在代码中到处写排除行代码。
-
如果您想排除 ENUM,您可能必须编写自己的查询。毕竟,枚举是为了让一个值必须与枚举中的内容相匹配。
-
那么在这种情况下,您希望
courseType属性具有什么值do?您的问题有点令人困惑,因为您首先提到调用get,然后您谈论“查询结果”,然后在 cmets 中您说这不是查询,而是get。如果您不希望get方法返回特定行,则应将其从表中删除。目前尚不清楚您为什么不想这样做。 -
@Codeer 你没有在这里澄清任何混淆,你正在添加它。 OP 在他的问题中声称有查询结果,但随后在他的评论中说这不是查询。 OP 应该澄清他们想要什么以及为什么他们不想要最明显的解决方案(从数据库中删除具有不再存在的类型课程的记录(如果需要,将它们归档到某个地方))
标签: java spring hibernate enums