Java 空字符串等于 NULL

Java Empty String equals NULL

我有以下问题:

我们正在使用 HibernateStruts 编写 Web 应用程序。提交后,我想检查是否已执行数据库更新。因此,我将对象从数据库中拉出并将其与表单中的数据进行比较(假设,我有一个 Person 对象,其中包含一些属性,例如 NameAddress 等) .

现在,如果 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();
}