如何使用hibernate和Legacy数据库修剪char字段pojo中的空格

时间:2014-02-20 09:04:45

标签: spring hibernate orm hibernate-mapping

我的表的列为char(5),无法将其更改为varchar(5)。因此,当我使用hibernateTemplate从表中获取值时,会返回添加的空格,其中包含实际的单个字母值。(客户定位是使用.trim()方法检查NPE)但我们是否有提供的方法来处理这种类型情况。 PS.I我正在使用Spring支持hibernate dao支持。 (在SQL中,CHAR数据类型是固定长度的字符串。根据定义,附加字符用空格填充。)

2 个答案:

答案 0 :(得分:1)

避免显式调用trim()的一种方法是,您可以使用Enitity中的@PostLoad注释提供生命周期方法。 例如:

@PostLoad
protected void trim(){
    if(stringAttr!=null){
        stringAttr=stringAttr.trim();
    }
}

答案 1 :(得分:0)

我已在similar question here

上提及讨论

在建议的解决方案中,我觉得添加用户类型最佳套件的要求更有意义,因为 1. @PostLoad(或实际生命周期方法)不能与使用Hibernate的SessionFactory一起使用。 2.在代码折射器中可以忽略评估者的修改,而另一个开发人员可能会忽略可能导致覆盖设置者的设置者。

所以我使用以下解决方案。 1.有一个package-info.java: - 这里有关于正在使用的typedef的详细信息。 2.使用@Type注释字段(type =" MyTrimTypeString") 3.定义了一个用户类型类MyTrimTypeString,Code for which followed reply by StepherSwensen在nullSafeGet上略有更新,看起来像

 @Override
  public Object nullSafeGet(ResultSet rs, String[] names, Object owner) throws HibernateException, SQLException
  {
    final String val = rs.getString(names[0]);
    return (val == null ? val : val.trim());
  }

和nullSafeSet看起来像:

@Override
  public void nullSafeSet(PreparedStatement st, Object value, int index) throws HibernateException, SQLException
  {
    final String val = (String)value;
    st.setString(index, val);
  }