在我们的应用程序中,我们从DB2大型机数据库中提取数据。如果数据库在字段中具有“低值”,则hibernate在对象中发送“null”值。即使将列定义为“非null”,也会发生这种情况。
由于我们正在对此进行XML解析,因此Castor遇到了麻烦。我想在Hibernate中解决这个问题。此外,所有hibernate hbm文件都是生成的,所以我们不能搞乱它们(它们会不时被重新生成。)
任何方法拦截所有字符串并用“”替换空值?
以下是我们提出的解决方案。实际上,这是一个大写的并且被截断(删除了许多抽象方法)。
public class UpperCaseUserType implements org.hibernate.usertype.UserType{
private static final int[] TYPES = {Types.VARCHAR};
public Object nullSafeGet(ResultSet resultSet, String[] strings, Object object) throws HibernateException, SQLException {
//This might be redundant to uppercase the getter...
return StringUtils.upperCase((String) Hibernate.STRING.nullSafeGet(resultSet, strings[0]));
}
public void nullSafeSet(PreparedStatement preparedStatement, Object object, int i) throws HibernateException, SQLException {
String string = StringUtils.upperCase((String) object);
Hibernate.STRING.nullSafeSet(preparedStatement, string, i);
}
}
然后你用这种方式把它连接起来:
<property name="partNumber" type="cat.dds.fpsdma.model.UpperCaseUserType">
<column name="PART_NUMBER" length="20" not-null="true" />
</property>
答案 0 :(得分:2)
null
替换为""
reveng.xml
中添加休眠类型名称的位置。答案 1 :(得分:1)
这是我们(向@Betlista和@markthegrea致谢)提出的解决方案。实际上,这是一种大写形式,并且会被截断(删除了许多抽象方法)。
public class UpperCaseUserType implements org.hibernate.usertype.UserType{
private static final int[] TYPES = {Types.VARCHAR};
public Object nullSafeGet(ResultSet resultSet, String[] strings, Object object) throws HibernateException, SQLException {
//This might be redundant to uppercase the getter...
return StringUtils.upperCase((String) Hibernate.STRING.nullSafeGet(resultSet, strings[0]));
}
public void nullSafeSet(PreparedStatement preparedStatement, Object object, int i) throws HibernateException, SQLException {
String string = StringUtils.upperCase((String) object);
Hibernate.STRING.nullSafeSet(preparedStatement, string, i);
}
}
然后您以这种方式进行连接:
<property name="partNumber" type="cat.dds.fpsdma.model.UpperCaseUserType">
<column name="PART_NUMBER" length="20" not-null="true" />
</property>
答案 2 :(得分:0)
您可以使用扩展EmptyInterceptor的hibernate拦截器在实际触发该查询之前执行您想要的操作。
这里给出的例子可以帮助你
http://www.mkyong.com/hibernate/hibernate-interceptor-example-audit-log/
答案 3 :(得分:0)
我可以通过简单地处理连接器设置程序中的数据库NULL值来解决同一方面的问题,如建议的here
/**
* Set the value related to the column: NOM
* @param nom the NOM value
*/
public void setNom (String nom) {
this.nom = (nom!= null) ? nom : "" ;
}