4

在我们的应用程序中,我们从 DB2 大型机数据库中提取数据。如果数据库在某个字段中有“低值”,hibernate 在对象中发送一个“空”值。即使该列被定义为“非空”,也会发生这种情况。

当我们对此进行 XML 解析时,Castor 遇到了麻烦。我想在 Hibernate 中解决这个问题。另外,所有的hibernate hbm文件都是生成的,所以我们不能乱用它们(它们会时不时地重新生成。)

有什么方法可以拦截所有字符串并将空值替换为""

4

4 回答 4

3
  • 创建自定义用户类型以null替换""
  • 将用户类型名称放在您通常将休眠类型名称放在reveng.xml.
于 2010-04-14T16:42:41.200 回答
1

这是我们(@Betlista@markthegrea的学分)提出的解决方案。实际上,这是一个大写的并且被截断(很多抽象方法被删除)。

 public class UpperCaseUserType implements org.hibernate.usertype.UserType{
    private static final int[] TYPES = {Types.VARCHAR};

    public Object nullSafeGet(ResultSet resultSet, String[] strings, Object object) throws HibernateException, SQLException {
        //This might be redundant to uppercase the getter...
        return StringUtils.upperCase((String) Hibernate.STRING.nullSafeGet(resultSet, strings[0]));
    }
    public void nullSafeSet(PreparedStatement preparedStatement, Object object, int i) throws HibernateException, SQLException {
        String string = StringUtils.upperCase((String) object);
        Hibernate.STRING.nullSafeSet(preparedStatement, string, i);
    }
}

然后你以这种方式连接它:

 <property name="partNumber" type="cat.dds.fpsdma.model.UpperCaseUserType">
        <column name="PART_NUMBER" length="20" not-null="true" />
 </property>
于 2019-12-11T06:33:44.380 回答
0

您可以使用扩展 EmptyInterceptor 的休眠拦截器在实际触发该查询之前执行您想要的操作。

此处给出的示例可能会对您有所帮助

http://www.mkyong.com/hibernate/hibernate-interceptor-example-audit-log/

于 2010-04-14T15:57:03.533 回答
0

我通过在连接器设置器中处理数据库 NULL 值来解决我这边的相同问题,就像这里建议的那样,使用一个简单的

/**
 * Set the value related to the column: NOM
 * @param nom the NOM value
 */
public void setNom (String nom) {
    this.nom = (nom!= null) ? nom : "" ;
}
于 2019-12-11T07:19:55.080 回答