Java Empty String等于NULL

时间:2015-02-16 12:25:26

标签: java string hibernate null struts

我有以下问题:

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

现在,如果网络表单上的字段Address为空,则表单属性会为我提供""空字符串)。如果我从DB对象获取Address属性并将其与form属性进行比较,则比较将返回FALSE,因为我比较""空字符串< / em>)与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将返回TRUE

4 个答案:

答案 0 :(得分:2)

不,因为它们不一样。 ""与<{1}}的非常不同

现在,如果您希望此行为,请编写自定义方法:

null

将此标记为 static ,因为这应该是一个帮助程序(并且应该也可以在辅助类中)

答案 1 :(得分:1)

由于oracle将所有空字符串存储为null,因此我们一直使用自定义数据类型映射相应列,该数据类型将数据库中的所有null - 值映射为空字符串。因此,从数据库中读取的所有String都将为空而不是null。

要创建此类型,您需要实现一个扩展org.hibernate.usertype.UserType;的类:

import org.hibernate.usertype.UserType;
public class OracleStringType implements UserType {...}

大多数必需的方法实现非常简单,因为您只需返回传入的参数。最有趣的是:

@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);
    }
}

答案 2 :(得分:0)

使用这个附加条件:

if (StringUtils.isEmpty(formObj.getAddress()) && StringUtils.isEmpty( dbObj.getAddress()))

答案 3 :(得分:0)

我将在此处留下我的解决方案:

为此,我在自己的StringUtils类中添加了一个方法(我们称之为StringTools以避免与Apache的StringUtils冲突):

public static boolean notEqualHibernateProperty(String s1, String s2) {
     return !ObjectUtils.equals(StringUtils.defaultString(s1), StringUtils.defaultString(s2));
}
如果参数值为StringUtils.defaultString(s),则

NULL返回空字符串。 然后我只是将更新条件更改为:

if (StringTools.notEqualHibernateProperty(formObj.getAddress(), dbObj.getAddress())) {
     dbObj.getAddress(formObj.getAddress());
     dbObj.update();
}