有没有办法做这样的事情。我有一个叫做人的实体。
@Entity
@Table(name = "PERSON")
public class Person {
@Column(name = "NAME", length = 128, columnDefinition = "VARCHAR2(128)")
String name;
@Column(name = "NATIONALITY", length = 128, columnDefinition = "VARCHAR2(128)")
String nationality;
}
民族'列具有数值 - 每个数字都是一个国家/地区的代码。我想绘制一个国籍'字段到我的自定义枚举并创建一些方法转换代码< - > country。
@Entity
@Table(name = "PERSON")
public class Person {
@Column(name = "NAME", length = 128, columnDefinition = "VARCHAR2(128)")
String name;
@Column(name = "NATIONALITY", length = 128, columnDefinition = "VARCHAR2(128)")
Nationality nationality;
}
enum Nationality {
USA, Brazil, Germany; // etc.
}
public static Nationality codeToNationality(String code);
这样的东西有没有hibernate方法?我无法修改列定义 - 数据库是只读的。
我想要实现的第二件事是排除任何未解决的国籍代码实体。 codeToNationality(...)== null的实体对于休眠是不可见的。
我的模特(人,国籍)只是一个例子。
感谢您的帮助!
答案 0 :(得分:4)
两个问题:
可以通过创建适当的UserType来解决。
可以在here找到有关枚举和自定义用户类型的示例。自定义类型的一般说明是Hibernate documentation的一部分。
其他选项是为枚举提供特定的setter,它们将转换为和映射到数据库列的字符串值。如果仅在此实体中需要此自定义类型,则这是可行的。
答案 1 :(得分:0)
对于您的第一个问题,请查看@Enumerated
JPA Annotation,这会将您的字符串映射到枚举。使用(EnumType.STRING)
属性,您应该能够覆盖枚举值的name()并返回与数据库中的字符串完全相同的字符串。
答案 2 :(得分:0)
好的,我已经使用UserType将String转换为国籍。
public Object nullSafeGet(ResultSet rs, String[] names, SessionImplementor session, Object owner) throws HibernateException, SQLException {
String value = rs.getString(names[0]);
// resolve nationality
return /nationality found/ ? /Nationality object/ : null;
}
现在我还有其他问题。如何创建仅寻找已解决国籍的标准?
当我这样做时
criteria.add(Restrictions.isNotNull("nationality"));
条件查询字符串字段,而不是国籍字段,它始终不为空。
我理解Criteria适用于原始数据库(在转换为java实体之前),所以我怎样才能得到我想要的东西 - 过滤未解决的国籍行?