在遗留数据库中映射char
字段时,剥离尾部空格的可能解决方案是什么?
我看到以下选项:
.trim()
.trim()
我倾向于覆盖属性访问器,以便域属性在整个应用程序中保持一致。
答案 0 :(得分:3)
我使用全局映射的Hibernate UserType,它运行良好(基于http://www.hibernate.org/388.html的实现,但更新了对UserType
接口的更改):
package company
import org.hibernate.Hibernate
import org.hibernate.usertype.UserType
import java.sql.PreparedStatement
import java.sql.ResultSet
import java.sql.SQLException
import java.sql.Types
/**
* Map CHAR(x) types to String: trim when getting and setting the CHAR(x)
* based on www.hibernate.org/388.html
*/
public class TrimmedString implements UserType {
public TrimmedString() {
}
public int[] sqlTypes() {
return [Types.CHAR] as int[];
}
@SuppressWarnings("unchecked")
public Class returnedClass() {
return String.class;
}
public boolean equals(Object x, Object y) {
return (x == y) || (x != null && y != null && (x.equals(y)));
}
public Object nullSafeGet(ResultSet inResultSet, String[] names, Object o) throws SQLException {
String val = (String) Hibernate.STRING.nullSafeGet(inResultSet, names[0]);
return val == null ? null : val.trim();
}
public void nullSafeSet(PreparedStatement inPreparedStatement, Object o, int i) throws SQLException {
String val = (String) o;
inPreparedStatement.setString(i, val);
}
public Object deepCopy(Object o) {
if (o == null) {
return null;
}
return new String(((String) o));
}
public boolean isMutable() {
return false;
}
public Object assemble(Serializable cached, Object owner) {
return cached;
}
public Serializable disassemble(Object value) {
return (Serializable) value;
}
public Object replace(Object original, Object target, Object owner) {
return original;
}
public int hashCode(Object x) {
return x.hashCode();
}
}
Groovy.config中的全局映射:
grails.gorm.default.mapping = {
'user-type'(type: company.TrimmedString, class: String) //map Char(x) columns mapped to string fields as trimmed string
}
答案 1 :(得分:2)
我有类似的问题,我无法改变遗留数据。为了透明度,我最终覆盖了访问者,我的开发人员。我建议使用瞬态字段,这样您就不必在每次调用时修剪字符串。的然而强>;如果你只是清理表中的数据,创建一个视图,或者转移到一个新表,我会这样做。