Удаление пробельных символов из полей char в устаревшей базе данных с помощью Grails GORM - PullRequest
5 голосов
/ 12 июля 2011

Каковы возможные решения для удаления конечных пробелов при сопоставлении полей char в устаревшей базе данных?

Я вижу следующие варианты:

  • Вызов .trim() вточка использования (контроллер, представление и т. д.)
  • Переопределить средства доступа к свойствам для возврата .trim()
  • Использование Hibernate UserType для обрезки пробела

I 'Я склоняюсь к переопределению метода доступа к свойствам, чтобы свойства домена оставались согласованными во всем приложении.

Ответы [ 2 ]

3 голосов
/ 05 февраля 2013

Я использую глобально сопоставленный 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
}
2 голосов
/ 12 июля 2011

У меня была похожая проблема, и я не мог изменить устаревшие данные.В итоге я переопределил метод доступа ради прозрачности для моих коллег-разработчиков.Я бы порекомендовал использовать переходное поле, чтобы вам не приходилось обрезать строку при каждом вызове. Однако ;если вы можете просто очистить данные в таблице, создать представление или перенести в новую таблицу, я бы сделал это вместо этого.

...