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

时间:2013-01-10 06:06:18

标签: java hibernate

我正在使用Oracle 11GR2,当varchar2字段为空时,在空字段上执行System.out.println将在我的Eclipse控制台上显示null。我怎样才能让它显示空字符串呢?

3 个答案:

答案 0 :(得分:5)

在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's document for use of interceptor

答案 1 :(得分:3)

你的getter方法:

public String getVarchar2()
{
    if(this.varchar2==null)
        return "";
    else
        return this.varchar2;
}

答案 2 :(得分:1)

如果要更改所有字符串的行为,可以使用Interceptor。 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's document for use of interceptor

相关问题