Grails多列索引

时间:2009-10-02 17:57:30

标签: database grails gorm indexing

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

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

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

一些工作示例和解释将受到高度赞赏!

4 个答案:

答案 0 :(得分: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”的索引,其索引中包含三列。

下行:列按字母顺序列在索引中,而不是输入的顺序。

答案 1 :(得分:6)

要使索引成为多列,请使用逗号分隔符列出列(注意,逗号后面没有空格,以避免使用this bug。您指向的第二个URL会出现错误,如下所示:

index:'Name_Idx, Address_Index'

有空间;它应该工作

index:'Name_Idx,Address_Index'

您指向的第一个网址是建议的更改(我不相信它目前正在实施,也不知道它有多大可能发生。)

答案 2 :(得分:3)

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

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

static mapping = {
      name index:'name_idx'
}

很抱歉,但我不知道如何定义多列索引,如果您在此处没有得到答案,请尝试Grails mailing list。如果不能在域类中直接声明多列索引,则可以在SQL文件中定义它们,如果它们尚不存在(或删除并重新创建它们),则创建它们。此SQL文件可以由init

中的Bootstrap.groovy闭包执行

答案 3 :(得分: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);")
    }