char
のフィールドをレガシーデータベースにマッピングするときに、後続の空白を取り除く方法はありますか? レガシーデータベースの文字フィールドから末尾の空白を削除するGORM
.trim()
.trim()
を呼び出す
- :
は、私は、次のオプションを参照してください
私は、ドメインプロパティがアプリケーション全体で一貫しているようにプロパティアクセサをオーバーライドする傾向があります。
char
のフィールドをレガシーデータベースにマッピングするときに、後続の空白を取り除く方法はありますか? レガシーデータベースの文字フィールドから末尾の空白を削除するGORM
.trim()
.trim()
を呼び出す
は、私は、次のオプションを参照してください
私は、ドメインプロパティがアプリケーション全体で一貫しているようにプロパティアクセサをオーバーライドする傾向があります。
私は同様の問題がありました。私は従来のデータを変更できませんでした。私は仲間の開発者への透明性のためにアクセサーをオーバーライドしました。私は一時的なフィールドを使用することをお勧めしますので、すべての呼び出しで文字列をトリムする必要はありません。 しかし、;テーブルのデータをクリーンアップしたり、ビューを作成したり、新しいテーブルに転送したりすることができれば、代わりにそれを実行します。
(実装は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
}
どのように検証を処理しましたか?明らかに、Grailsは一時的なプロパティの制約を検証していません。 – jamesallman
えええええええええええええええええええええええええええええええええええええ、手動で処理し、メッセージをフラッシュスコープに追加する必要があります。おそらく、beforeSaveインターセプタを使用して、少し透明に感じさせ、そこに検証を置くことができます。 –
**ビューは素晴らしい解決策です**。ビューはサブクエリとして置き換えられました。一部のDBエンジンは結果クエリを最適化できます(サブクエリを避ける)。また、表示されているジョインが多い場合は、**マテリアライズドビュー**のビルドが可能です。 **テーブルからのすべての**インデックス**は考慮に入れます。 – gavenkoa