15

有人可以解释如何在 Grails 中定义多列索引吗?文档充其量是稀疏的。

例如,这似乎根本不起作用:http: //grails.org/GORM+Index+definitions

我对此有一些运气,但结果似乎充其量是随机的。在一个域类中有效的定义在应用于另一个域类时不起作用(当然名称不同)。 http://www.grails.org/doc/1.1/guide/single.html#5.5.2.6%20Database%20Indices

一些工作示例和解释将不胜感激!

4

4 回答 4

17

对我来说适用于多列索引的解决方案是:

class ClassName {
    String name
    String description
    String state

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

这将创建一个名为“name_idx”的索引,其中包含索引中的三列。

缺点:这些列按字母顺序在索引中列出,而不是按输入的顺序列出。

于 2010-04-22T19:50:15.550 回答
6

要使索引为多列,请使用逗号分隔符列出列(请注意,逗号后没有空格,以避免出现此错误。您指向的第二个 URL 会遇到错误,正如它所说:

index:'Name_Idx, Address_Index'

有空格;它应该作为

index:'Name_Idx,Address_Index'

您指向的第一个 URL 是一个提议的更改(我不相信它目前已实施,也不知道它的可能性有多大)。

于 2009-10-10T23:37:19.267 回答
3

AFAIK,此处index显示的闭包从未实现,因此应忽略这些示例(此页面用于讨论可能的实现,而不是记录实际实现)。

name_idxname属性定义单列索引的正确方法是

static mapping = {
      name index:'name_idx'
}

抱歉,但我不知道如何定义多列索引,如果您在这里没有得到答案,请尝试Grails 邮件列表。万一不能在域类中直接声明多列索引,您可以在 SQL 文件中定义它们,如果它们不存在则创建它们(或删除并重新创建它们)。这个 SQL 文件可以通过init闭包来执行Bootstrap.groovy

于 2009-10-06T15:19:44.300 回答
3

我需要能够控制我的多列索引中列的顺序并使其独一无二。我通过使用直接 SQL 在 Bootstrap 中创建索引来解决 GORM / Hibernate 的限制:

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);")
    }
于 2011-09-18T16:14:28.387 回答