當在遺留數據庫中映射char
字段時,剝離尾隨空白的可能解決方案是什麼?使用Grails GORM從遺留數據庫中的char字段中去除尾隨空白
我看到如下選項:
- 在使用點(控制器,視圖等)調用
.trim()
- 覆蓋屬性訪問返回
.trim()
- 使用一個Hibernate的UserType修剪空白
我傾向於覆蓋屬性訪問器,使域屬性在整個應用程序中保持一致。
當在遺留數據庫中映射char
字段時,剝離尾隨空白的可能解決方案是什麼?使用Grails GORM從遺留數據庫中的char字段中去除尾隨空白
我看到如下選項:
.trim()
.trim()
我傾向於覆蓋屬性訪問器,使域屬性在整個應用程序中保持一致。
我有一個類似的問題,我不能改變遺留數據。爲了讓我的開發人員瞭解透明度,我最終重寫了訪問者。我建議使用瞬態字段,這樣您就不必在每次調用時修剪字符串。 但是;如果你只是清理表中的數據,創建一個視圖,或者轉移到一個新表中,我會這樣做。
我用一個全局映射Hibernate的用戶類型和它的作品(基於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
}
你是如何處理驗證的?顯然Grails不會驗證瞬態屬性的約束。 – jamesallman
是的 - Grails不喜歡使用瞬態字段的標準驗證。您必須手動處理它並處理將消息添加到閃存範圍。也許你可以看看使用beforeSave攔截器讓它感覺更透明一些,並將驗證放在那裏。 –
**意見是很好的解決方案**。視圖只是替換爲子查詢,某些數據庫引擎可以優化結果查詢(避免子查詢)。如果你有很多連接在視圖中,也可以構建**物化視圖。來自桌子的任何**索引**都考慮在內。 – gavenkoa