如何使用休眠和旧版数据库从 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 查询的替代方法?

通过 Windows 10“设置”应用程序和旧版控制面板卸载应用程序有啥区别? [关闭]

旧版“dhcp”和新版“dhcp”有啥区别?

Kibana 7.10.0 功能更新

JOOQ - 相当于用于填充历史字段的休眠拦截器?