0

有没有办法做这样的事情。我有一个叫做人的实体。

@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;
}

'NATIONALITY' 列具有数值 - 每个数字都是一个国家/地区的代码。我想将“国籍”字段映射到我的自定义枚举并创建一些方法转换代码<->国家。

@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);

有没有这样的休眠方法?我无法修改列定义 - 数据库是只读的。

我想要实现的第二件事是排除任何未解决国籍代码的实体。codeToNationality(...) == null 的实体对休眠是不可见的。

我的模型(个人、国籍)只是一个例子。

谢谢你的帮助!

4

3 回答 3

4

两个问题:

  1. 通常将枚举映射到某个字符串,并且
  2. 映射未知到空

可以通过创建适当的UserType来解决。

可以从这里找到一些关于枚举和自定义用户类型的示例。自定义类型的一般描述是Hibernate 文档的一部分。

其他选项是为枚举提供特定的设置器,这些设置器将与映射到数据库列的字符串值相互转换。如果仅在此实体中需要此自定义类型,这可能是可行的。

于 2012-07-23T09:39:20.857 回答
0

好的,我已经使用 UserType 将字符串转换为国籍。

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"));

条件查询字符串字段,而不是国籍字段,该字段始终不为空。

我知道标准适用于原始数据库(在转换为 java 实体之前),所以我怎样才能得到我想要的 - 过滤未解决国籍的行?

于 2012-07-24T12:47:44.403 回答
0

对于您的第一个问题,请查看@EnumeratedJPA 注释,这会将您的字符串映射到枚举。使用(EnumType.STRING)属性,您应该能够覆盖枚举值的 name() 并完全按照它们在数据库中的状态返回字符串。

于 2012-07-23T09:50:47.367 回答