Вопрос

Кто-нибудь может объяснить, как определить многоколоночные индексы в Grails?Документация в лучшем случае скудна.

Это, например, похоже, вообще не работает:http://grails.org/GORM+Index+definitions

Мне немного повезло с этим, но результаты в лучшем случае кажутся случайными.Определения, которые работают в одном классе домена, этого не делают, когда применяются к другому (с разными именами, конечно).http://www.grails.org/doc/1.1/guide/single.html#5.5.2.6%20Database%20Indices

Мы были бы весьма признательны за некоторые рабочие примеры и пояснения!

Это было полезно?

Решение

Решение, которое сработало для меня для многоколоночных индексов, является:

class ClassName {
    String name
    String description
    String state

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

Это создает индекс с именем 'name_idx' с тремя столбцами в индексе.

Обратная сторона:столбцы перечислены в индексе в алфавитном порядке, а не в том порядке, в котором они были введены.

Другие советы

Чтобы сделать ваш индекс многоколоночным, перечислите столбцы через разделитель-запятую (обратите внимание, без пробела после запятой, чтобы избежать этот баг.Второй URL-адрес, на который вы указываете, указывает на ошибку, как там написано:

index:'Name_Idx, Address_Index'

с пробелом;это должно работать как

index:'Name_Idx,Address_Index'

Первый URL-адрес, на который вы указали, был предлагаемым изменением (я не верю, что оно реализовано в настоящее время, и понятия не имею, насколько вероятно, что оно когда-либо будет).

AFAIK, в index показанное закрытие здесь никогда не был реализован, поэтому эти примеры следует игнорировать (эта страница предназначена для обсуждения возможных реализаций, а не для документирования фактической реализации).

Правильный способ определения индекса с одним столбцом name_idx для name свойство является

static mapping = {
      name index:'name_idx'
}

Извините, но я не знаю, как определить многоколоночный индекс, попробуйте Список рассылки Grails если вы не получите ответа здесь.В маловероятном случае, если многоколоночные индексы не могут быть объявлены непосредственно в классах домена, вы могли бы определить их в файле SQL, который создает их, если они еще не существуют (или удаляет и создает заново).Этот SQL-файл может быть выполнен с помощью init закрытие в Bootstrap.groovy

Мне нужно было иметь возможность контролировать порядок столбцов в моем многоколоночном индексе, а также сделать его уникальным.Я обошел ограничения GORM / Hibernate, создав индекс в Bootstrap с использованием прямого SQL:

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);")
    }
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top