我的表的列为char(5),无法将其更改为varchar(5)。因此,当我使用hibernateTemplate从表中获取值时,会返回添加的空格,其中包含实际的单个字母值。(客户定位是使用.trim()方法检查NPE)但我们是否有提供的方法来处理这种类型情况。 PS.I我正在使用Spring支持hibernate dao支持。 (在SQL中,CHAR数据类型是固定长度的字符串。根据定义,附加字符用空格填充。)
答案 0 :(得分:1)
避免显式调用trim()的一种方法是,您可以使用Enitity中的@PostLoad
注释提供生命周期方法。
例如:
@PostLoad
protected void trim(){
if(stringAttr!=null){
stringAttr=stringAttr.trim();
}
}
答案 1 :(得分:0)
在建议的解决方案中,我觉得添加用户类型最佳套件的要求更有意义,因为 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);
}