我有以下问题:
我们正在使用 Hibernate 和 Struts 编写Web应用程序。提交后,我想检查是否已执行数据库更新。所以我将对象从数据库中拉出来并将其与表单中的数据进行比较(我们假设,我有一个Person
对象,其中包含Name
,Address
等属性。
现在,如果网络表单上的字段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
?
答案 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();
}