6

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

4

3 回答 3

6

在 getter 中做这个技巧很好,但它会改变模型的期望行为。

正如我的评论中所引用的,Oracle 无法区分空字符串和 null。如果您确定您使用的所有字符串属性永远不会为空,您可以像这样在休眠中创建一个拦截器

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 的文档

于 2013-01-10T06:42:37.953 回答
3

你的吸气剂方法:

public String getVarchar2()
{
    if(this.varchar2==null)
        return "";
    else
        return this.varchar2;
}
于 2013-01-10T06:09:34.463 回答
2

拦截器是要走的路,如果你想改变所有字符串的行为。Oracle 在内部将空字符串视为 null('' is null返回 true),但这可能不适用于其他数据库。对于他们,您也应该覆盖onFlushDirtyandonSave方法以不在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 的文档

于 2014-11-18T07:08:33.580 回答