Java 空字符串等于 NULL
Java Empty String equals NULL
我有以下问题:
我们正在使用 Hibernate 和 Struts 编写 Web 应用程序。提交后,我想检查是否已执行数据库更新。因此,我将对象从数据库中拉出并将其与表单中的数据进行比较(假设,我有一个 Person
对象,其中包含一些属性,例如 Name
、Address
等) .
现在,如果 Web 表单上的字段 Address
为空,表单 属性 会给我一个 ""
(Empty String) .如果我将我从 DB 对象获得的 Address
属性 与 属性 的形式进行比较,比较将是 return FALSE
因为我比较了一个""
(Empty String) 与 NULL
显然不一样。
我尝试了以下方法:
if (StringUtils.equals(formObj.getAddress(), dbObj.getAddress())) {
dbObj.getAddress(formObj.getAddress());
dbObj.update();
}
if (ObjectUtils.equals(formObj.getAddress(), dbObj.getAddress())) {
dbObj.getAddress(formObj.getAddress());
dbObj.update();
}
我的问题是:是否有一种方法可以将这些转换为字符串值并进行比较,从而 "" == NULL
会 return TRUE
?
使用这个附加条件:
if (StringUtils.isEmpty(formObj.getAddress()) && StringUtils.isEmpty( dbObj.getAddress()))
不,因为它们不一样。 ""
与 null
非常不同。
现在,如果您想要此行为,请编写自定义方法:
static boolean checkIfEmptyOrNull(String s1, String s2) {
//check for empty and null
return myBooleanValue;
}
将其标记为 static 因为这应该是一个助手(并且可能也应该进入一个助手 class)
由于 oracle 将所有空字符串存储为 null
,我们一直在使用自定义数据类型映射相应的列,该数据类型将数据库中的所有 null
值映射到空字符串。因此从数据库中读取的所有 String
都将为空而不是 null。
要创建此类型,您需要实现 class 扩展 org.hibernate.usertype.UserType;
:
import org.hibernate.usertype.UserType;
public class OracleStringType implements UserType {...}
大多数必需的方法实现都非常简单,因为您只需 return 传入的参数。最有趣的是这些:
@Override
public boolean equals(Object arg0, Object arg1) throws HibernateException {
if(arg0 == null) arg0 = "";
if(arg1 == null) arg1 = "";
return arg0.equals(arg1);
}
@Override
public int hashCode(Object arg0) throws HibernateException {
if(arg0==null) arg0="";
return arg0.hashCode();
}
@Override
public Object nullSafeGet(ResultSet resultSet, String[] names, Object owner)
throws HibernateException, SQLException {
String result = resultSet.getString(names[0]);
if(resultSet.wasNull()) return "";
return result;
}
@Override
public void nullSafeSet(PreparedStatement statement, Object value, int index)
throws HibernateException, SQLException {
if(value == null) {
statement.setNull(index, Hibernate.STRING.sqlType());
} else {
String valueString = (String)value;
statement.setString(index, valueString);
}
}
我会在这里留下我的解决方案:
为了这个目的,我在我们自己的StringUtils中添加了一个方法class(我们称它为StringTools
以避免与Apache的StringUtils
冲突):
public static boolean notEqualHibernateProperty(String s1, String s2) {
return !ObjectUtils.equals(StringUtils.defaultString(s1), StringUtils.defaultString(s2));
}
StringUtils.defaultString(s)
returns 空字符串,如果参数值为 NULL
。
然后我干脆把更新条件改成了:
if (StringTools.notEqualHibernateProperty(formObj.getAddress(), dbObj.getAddress())) {
dbObj.getAddress(formObj.getAddress());
dbObj.update();
}
我有以下问题:
我们正在使用 Hibernate 和 Struts 编写 Web 应用程序。提交后,我想检查是否已执行数据库更新。因此,我将对象从数据库中拉出并将其与表单中的数据进行比较(假设,我有一个 Person
对象,其中包含一些属性,例如 Name
、Address
等) .
现在,如果 Web 表单上的字段 Address
为空,表单 属性 会给我一个 ""
(Empty String) .如果我将我从 DB 对象获得的 Address
属性 与 属性 的形式进行比较,比较将是 return FALSE
因为我比较了一个""
(Empty String) 与 NULL
显然不一样。
我尝试了以下方法:
if (StringUtils.equals(formObj.getAddress(), dbObj.getAddress())) {
dbObj.getAddress(formObj.getAddress());
dbObj.update();
}
if (ObjectUtils.equals(formObj.getAddress(), dbObj.getAddress())) {
dbObj.getAddress(formObj.getAddress());
dbObj.update();
}
我的问题是:是否有一种方法可以将这些转换为字符串值并进行比较,从而 "" == NULL
会 return TRUE
?
使用这个附加条件:
if (StringUtils.isEmpty(formObj.getAddress()) && StringUtils.isEmpty( dbObj.getAddress()))
不,因为它们不一样。 ""
与 null
非常不同。
现在,如果您想要此行为,请编写自定义方法:
static boolean checkIfEmptyOrNull(String s1, String s2) {
//check for empty and null
return myBooleanValue;
}
将其标记为 static 因为这应该是一个助手(并且可能也应该进入一个助手 class)
由于 oracle 将所有空字符串存储为 null
,我们一直在使用自定义数据类型映射相应的列,该数据类型将数据库中的所有 null
值映射到空字符串。因此从数据库中读取的所有 String
都将为空而不是 null。
要创建此类型,您需要实现 class 扩展 org.hibernate.usertype.UserType;
:
import org.hibernate.usertype.UserType;
public class OracleStringType implements UserType {...}
大多数必需的方法实现都非常简单,因为您只需 return 传入的参数。最有趣的是这些:
@Override
public boolean equals(Object arg0, Object arg1) throws HibernateException {
if(arg0 == null) arg0 = "";
if(arg1 == null) arg1 = "";
return arg0.equals(arg1);
}
@Override
public int hashCode(Object arg0) throws HibernateException {
if(arg0==null) arg0="";
return arg0.hashCode();
}
@Override
public Object nullSafeGet(ResultSet resultSet, String[] names, Object owner)
throws HibernateException, SQLException {
String result = resultSet.getString(names[0]);
if(resultSet.wasNull()) return "";
return result;
}
@Override
public void nullSafeSet(PreparedStatement statement, Object value, int index)
throws HibernateException, SQLException {
if(value == null) {
statement.setNull(index, Hibernate.STRING.sqlType());
} else {
String valueString = (String)value;
statement.setString(index, valueString);
}
}
我会在这里留下我的解决方案:
为了这个目的,我在我们自己的StringUtils中添加了一个方法class(我们称它为StringTools
以避免与Apache的StringUtils
冲突):
public static boolean notEqualHibernateProperty(String s1, String s2) {
return !ObjectUtils.equals(StringUtils.defaultString(s1), StringUtils.defaultString(s2));
}
StringUtils.defaultString(s)
returns 空字符串,如果参数值为 NULL
。
然后我干脆把更新条件改成了:
if (StringTools.notEqualHibernateProperty(formObj.getAddress(), dbObj.getAddress())) {
dbObj.getAddress(formObj.getAddress());
dbObj.update();
}