如何强制Hibernate返回一个空值而不是null?

7

我使用的是Oracle 11GR2,当varchar2字段为空时,在Eclipse控制台上对空字段执行System.out.println将显示null。如何使其显示空字符串?


1
问题在于,在Oracle中使用varchar2时,null和空字符串之间没有区别。实际上,在Oracle中使用varchar2的空字符串意味着null。然而,我相信你可以编写一个Hibernate拦截器来处理这种情况,以便你可以用空字符串“替换”null字符串。 - Adrian Shum
3个回答

6
在getter中做手脚是可以的,但它会改变模型的期望行为。正如我在评论中引用的那样,Oracle无法区分空字符串和null。如果您确定您使用的所有字符串属性永远不会为null,您可以像这样在Hibernate中创建一个拦截器。
public class EmptyStringInterceptor extends EmptyInterceptor {
   @Override
   public boolean onLoad(Object entity, 
                         Serializable id, 
                         Object[] state, 
                         String[] propertyNames,
                         Type[] types) {
      for (int i = 0; i < types.length; i++) {
         if (StringType.equals(types[i]) && state[i] == null) {
               state[i] = "";
         }
      }
      return true;
   }
}

您可以参考Hibernate拦截器使用文档


3
您的getter方法:
public String getVarchar2()
{
    if(this.varchar2==null)
        return "";
    else
        return this.varchar2;
}

我想到了。我希望我不必从那里开始做 :P - mrjayviper

2

如果您想更改所有字符串的行为,拦截器是一种可行的方法。Oracle在内部将空字符串视为null('' is null返回true),但其他数据库可能不支持此操作。对于这些数据库,您还应覆盖onFlushDirtyonSave方法以避免在数据库中使用null(或始终使用它们,如果您喜欢):

public class MPSessionInterceptor extends EmptyInterceptor {

    @Override
    public boolean onFlushDirty(Object entity, Serializable id, Object[] currentState, 
            Object[] previousState, String[] propertyNames, Type[] types) {
        return convertEmptyStrings(currentState, types);
    }

    @Override
    public boolean onSave(Object entity, Serializable id, Object[] state,
            String[] propertyNames, Type[] types) {
        return convertEmptyStrings(state, types);
    }

    @Override
    public boolean onLoad(Object entity, Serializable id, Object[] state, 
            String[] propertyNames, Type[] types) {
        return convertEmptyStrings(state, types);
    }

    private boolean convertEmptyStrings(Object[] state, Type[] types) {
        // convert nulls to empty strings
        boolean modified = false;
        for (int i=0; i<state.length; i++)
            if ((types[i] instanceof StringType) && state[i] == null) {
                state[i] = "";
                modified = true;
            }
        return modified;
    }

}

您可以参考 Hibernate文档中的拦截器使用

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接