如何强制Hibernate返回空值而不是null?
我正在使用Oracle 11GR2,当varchar2字段为空时,在空字段上执行System.out.println
将在我的Eclipse控制台上显示null
。 我怎样才能让它显示空字符串呢?
你的getter方法:
public String getVarchar2() { if(this.varchar2==null) return ""; else return this.varchar2; }
在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的文档来使用拦截器
如果要更改所有字符串的行为,拦截器是可行的方法。 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
您可以参考Hibernate的文档来使用拦截器