2011-07-12 137 views
5

當在遺留數據庫中映射char字段時,剝離尾隨空白的可能解決方案是什麼?使用Grails GORM從遺留數據庫中的char字段中去除尾隨空白

我看到如下選項:

  • 在使用點(控制器,視圖等)調用.trim()
  • 覆蓋屬性訪問返回.trim()
  • 使用一個Hibernate的UserType修剪空白

我傾向於覆蓋屬性訪問器,使域屬性在整個應用程序中保持一致。

回答

2

我有一個類似的問題,我不能改變遺留數據。爲了讓我的開發人員瞭解透明度,我最終重寫了訪問者。我建議使用瞬態字段,這樣您就不必在每次調用時修剪字符串。 但是;如果你只是清理表中的數據,創建一個視圖,或者轉移到一個新表中,我會這樣做。

+0

你是如何處理驗證的?顯然Grails不會驗證瞬態屬性的約束。 – jamesallman

+0

是的 - Grails不喜歡使用瞬態字段的標準驗證。您必須手動處理它並處理將消息添加到閃存範圍。也許你可以看看使用beforeSave攔截器讓它感覺更透明一些,並將驗證放在那裏。 –

+1

**意見是很好的解決方案**。視圖只是替換爲子查詢,某些數據庫引擎可以優化結果查詢(避免子查詢)。如果你有很多連接在視圖中,也可以構建**物化視圖。來自桌子的任何**索引**都考慮在內。 – gavenkoa

3

我用一個全局映射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 
} 
相關問題