Grails多列索引

15
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"的索引,其中包含索引中的三列。

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


有没有设置复合索引顺序的方法? - Feng Yu

6
要使您的索引多列,使用逗号分隔列(注意,逗号后不要加空格,以避免this bug。您指向的第二个URL会触发此错误,因为它显示:
index:'Name_Idx, Address_Index'

带空格;它应该正常工作。
index:'Name_Idx,Address_Index'

你指向的第一个URL是一个提议的更改(我不认为它目前已实施,也不知道它是否有可能被实施)。

我已经尝试过(从参考资料中)了,但运气不太好。它似乎工作得相当随机。对于一个表格有效的东西,在另一个表格中可能会得到不同的结果。索引名称的约定是什么?"Address_Index"是否必须为另一列定义 - 还是Grails可以神奇地发现它必须成为"address"字段的索引? - Kimble
@Kimble,我不认为命名中有任何神奇之处(尽管文档和实现足够混乱,以至于我不能确定)。 - Alex Martelli
这个“无空格”错误正在折磨我。 - No Idea For Name

3
据我所知,此处展示的index闭包在这里从未被实现,因此应忽略这些示例(该页面用于讨论可能的实现,而不是记录实际实现)。
定义单列索引name_idx的正确方式是:
static mapping = {
      name index:'name_idx'
}

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

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);")
    }

4
这可能更适合于数据库迁移插件,而不是引导程序。 - cdeszaq

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接