我正在使用 Oracle 11GR2,当 varchar2 字段为空时,System.out.println
对空字段执行 a 将显示null
在我的 Eclipse 控制台上。我怎样才能让它显示空字符串呢?
问问题
9288 次
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),但这可能不适用于其他数据库。对于他们,您也应该覆盖onFlushDirty
andonSave
方法以不在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 回答