如何使用休眠和旧版数据库从 char 字段 pojo 中修剪空格
Posted
技术标签:
【中文标题】如何使用休眠和旧版数据库从 char 字段 pojo 中修剪空格【英文标题】:How to trim white spaces from char fields pojo using hibernate and Legacy database 【发布时间】:2014-02-20 09:04:44 【问题描述】:我的表有 char(5) 列,无法将其更改为 varchar(5)。因此,当我使用 hibernateTemplate 从表中提取值时,它会返回带有实际说单个字母值的添加空格。(客户修复是使用 .trim() 方法检查 NPE)但是我们是否有提供处理这种类型的方法的情况。 PS.我正在使用 Spring 支持来支持休眠 dao。 (在 SQL 中,CHAR 数据类型是固定长度的字符串。根据定义,附加字符用空格填充。)
【问题讨论】:
【参考方案1】:避免显式调用 trim() 的一种方法是您可以在您的实体中使用 @PostLoad
注释提供生命周期方法。
例如:
@PostLoad
protected void trim()
if(stringAttr!=null)
stringAttr=stringAttr.trim();
【讨论】:
它很像提供一个setter方法。这没有错,但正在寻找一些通用的解决方案 如果将此操作移至 setters/getters ,则此检查将在初始加载时以及对方法的每个后续调用中进行。在这种方法中,只有在初始加载时才会执行此操作。 @PostLoad 在使用带有休眠方式的会话工厂时永远不会被调用。请参阅 [链接] (***.com/questions/2802676/…)【参考方案2】:我已经提到了similar question here的讨论
在建议的解决方案中,我认为添加用户类型最符合要求并且更有意义,因为 1. @PostLoad(或实际上是生命周期方法)不适用于将 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);
【讨论】:
以上是关于如何使用休眠和旧版数据库从 char 字段 pojo 中修剪空格的主要内容,如果未能解决你的问题,请参考以下文章
为啥我在使用 ActionBar Sherlock 和旧版 android 版本时在 onCreate() 处收到错误? [关闭]
在 BigQuery 中使用 dryRun 区分标准和旧版 SQL 查询的替代方法?