我正在使用Oracle 11GR2,当varchar2字段为空时,在空字段上执行System.out.println
将在我的Eclipse控制台上显示null
。我怎样才能让它显示空字符串呢?
答案 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;
}
}
答案 1 :(得分:3)
你的getter方法:
public String getVarchar2()
{
if(this.varchar2==null)
return "";
else
return this.varchar2;
}
答案 2 :(得分:1)
如果要更改所有字符串的行为,可以使用Interceptor。 Oracle内部将空字符串视为null('' is null
返回true),但这可能不适用于其他数据库。对于他们,您应该覆盖onFlushDirty
和onSave
方法,以便在数据库中不使用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;
}
}