2011-07-12 11 views
5

charのフィールドをレガシーデータベースにマッピングするときに、後続の空白を取り除く方法はありますか? レガシーデータベースの文字フィールドから末尾の空白を削除するGORM

  • オーバーライドプロパティアクセサは空白をトリムするにHibernateのUserTypeを使用し.trim()
  • を返すために使用のポイント(コントローラ、ビュー、など)で.trim()を呼び出す

    • は、私は、次のオプションを参照してください

    私は、ドメインプロパティがアプリケーション全体で一貫しているようにプロパティアクセサをオーバーライドする傾向があります。

  • 答えて

    2

    私は同様の問題がありました。私は従来のデータを変更できませんでした。私は仲間の開発者への透明性のためにアクセサーをオーバーライドしました。私は一時的なフィールドを使用することをお勧めしますので、すべての呼び出しで文字列をトリムする必要はありません。 しかし、;テーブルのデータをクリーンアップしたり、ビューを作成したり、新しいテーブルに転送したりすることができれば、代わりにそれを実行します。

    +0

    どのように検証を処理しましたか?明らかに、Grailsは一時的なプロパティの制約を検証していません。 – jamesallman

    +0

    えええええええええええええええええええええええええええええええええええええ、手動で処理し、メッセージをフラッシュスコープに追加する必要があります。おそらく、beforeSaveインターセプタを使用して、少し透明に感じさせ、そこに検証を置くことができます。 –

    +1

    **ビューは素晴らしい解決策です**。ビューはサブクエリとして置き換えられました。一部のDBエンジンは結果クエリを最適化できます(サブクエリを避ける)。また、表示されているジョインが多い場合は、**マテリアライズドビュー**のビルドが可能です。 **テーブルからのすべての**インデックス**は考慮に入れます。 – gavenkoa

    3

    (実装はhttp://www.hibernate.org/388.htmlに基づいていますが、UserTypeインタフェースに変更を破壊するために更新)私は世界的にマッピングされた休止状態のUserTypeを使用して、それは素晴らしい作品:Groovy.configで

    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(); 
        } 
    } 
    

    グローバルマッピング:

    grails.gorm.default.mapping = { 
        'user-type'(type: company.TrimmedString, class: String) //map Char(x) columns mapped to string fields as trimmed string 
    } 
    
    関連する問題