2009-10-02 12 views
15

¿Alguien puede explicar cómo definir índices de múltiples columnas en Grails? La documentación es, en el mejor de los casos, escasa.Grails múltiples columnas índices

Esto no parece, por ejemplo, trabajar en absoluto: http://grails.org/GORM+Index+definitions

que he tenido un poco de suerte con este, pero los resultados parece aleatoria en el mejor. Las definiciones que funcionan en una clase de dominio no se aplican cuando se aplican a otra (con diferentes nombres por supuesto). http://www.grails.org/doc/1.1/guide/single.html#5.5.2.6%20Database%20Indices

¡Algunos ejemplos de trabajo y explicaciones serían muy apreciados!

Respuesta

17

La solución que me ha funcionado para los índices de varias columnas es:

class ClassName { 
    String name 
    String description 
    String state 

    static mapping = { 
     name index: 'name_idx' 
     description index: 'name_idx' 
     state index: 'name_idx' 
    } 
} 

Esto crea un índice llamado 'name_idx' con las tres columnas en el índice.

Desventaja: las columnas se enumeran en el índice en orden alfabético, no en el orden en que se ingresaron.

3

AFAIK, el index cierre mostrado here nunca se implementó, por lo que esos ejemplos deben ignorarse (esta página es para discutir posibles implementaciones, en lugar de documentar una implementación real).

La forma correcta de definir un índice de una sola columna name_idx una propiedad name es

static mapping = { 
     name index:'name_idx' 
} 

Lo sentimos, pero no sé cómo definir un índice de varias columnas, probar el Grails mailing list si don Obtenga una respuesta aquí. En el caso improbable de que los índices de varias columnas no se puedan declarar directamente en las clases de dominio, puede definirlos en un archivo SQL que los cree si aún no existen (o los descarta y los vuelve a crear). Este archivo SQL podría ser ejecutado por el cierre init en Bootstrap.groovy

5

Para que su índice de varias columnas, una lista de las columnas con separador de coma (nota, no hay espacio después de la coma, para evitar this bug. La segunda URL que apunta a los golpes el error, ya que dice:

index:'Name_Idx, Address_Index' 

con un espacio, sino que debe trabajar como

index:'Name_Idx,Address_Index' 

la primera URL que apunta a un cambio propuesto (no creo que se implementa actualmente y tienen no ide una probabilidad de que alguna vez lo sea).

+0

He intentado eso (de la referencia) con diversa suerte. Parece que funciona bastante al azar. Las cosas que funcionan para una tabla dan otro resultado en otra tabla. ¿Cuál es la convención con los nombres de índice? ¿Tiene que definirse "Address_Index" para otra columna? ¿O es que Grails descubre mágicamente que tiene que ser un índice para el campo "dirección"? – Kimble

+0

@Kimble, no creo que haya magia en la denominación (aunque es cierto que la implementación de docs _and_ es lo suficientemente confusa como para no estar seguro). –

3

Necesitaba poder controlar el orden de las columnas en mi índice de varias columnas y también hacerlo único. Trabajé alrededor de las limitaciones de GORM/Hibernate creando el índice en Bootstrap usando SQL directo:

class BootStrap { 

    DataSource dataSource 

    def init = { servletContext -> 
     if (!MyModel.count()) { // new database 
      createIndexes() 
      ... 
     } 
    } 

    private void createIndexes() { 
     Sql sql = new Sql(dataSource) 
     sql.execute("create unique index my_index on my_model(col1,col2);") 
    } 
+4

Esto probablemente sería más adecuado para el plugin [DB Migration] (http://grails.org/plugin/database-migration) en lugar del bootstrap. – cdeszaq

Cuestiones relacionadas