2011-07-12 11 views
5

¿Cuáles son las posibles soluciones para eliminar los espacios en blanco al mapear los campos char en una base de datos heredada?Eliminación del espacio en blanco posterior de los campos char en una base de datos heredada con Grails GORM

que ver las siguientes opciones:

  • Calling .trim() en el punto de uso (controlador, vista, etc)
  • de acceso de propiedad de anulación para volver .trim()
  • El uso de un Hibernate UserType para recortar el espacio en blanco

Me inclino por anular el acceso a la propiedad para que las propiedades del dominio permanezcan consistentes en toda la aplicación .

Respuesta

2

Tuve un problema similar y no pude alterar los datos heredados. Terminé anulando el acceso por transparencia a mis compañeros desarrolladores. Yo recomendaría usar un campo transitorio para que no tenga que recortar el String en cada llamada. Sin embargo,; si puedes limpiar los datos de la tabla, crear una vista o transferirlos a una nueva tabla, lo haré en su lugar.

+0

¿Cómo manejó la validación? Aparentemente, Grails no valida restricciones en propiedades transitorias. – jamesallman

+0

Sí, a Grails no le gusta usar la validación estándar para campos transitorios. Tendrá que manejarlo manualmente y tratar de agregar los mensajes para actualizar el alcance. Tal vez puedas usar el interceptor beforeSave para que se sienta un poco más transparente y poner la validación allí. –

+1

** Views es una buena solución **. Las vistas simplemente se reemplazan como subconsultas, algunos motores de bases de datos pueden optimizar las consultas resultantes (evitar las subconsultas). También es posible compilar ** vista materializada ** si tiene muchas combinaciones a la vista. Cualquier ** índices ** de la tabla tiene en cuenta a la vista. – gavenkoa

3

utilizo un mapeado global de hibernación UserType y funciona muy bien (aplicación basada en http://www.hibernate.org/388.html, pero actualizado para romper cambios en la interfaz 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(); 
    } 
} 

mapeo global en Groovy.config:

grails.gorm.default.mapping = { 
    'user-type'(type: company.TrimmedString, class: String) //map Char(x) columns mapped to string fields as trimmed string 
} 
Cuestiones relacionadas