Grails 多列索引

Posted

技术标签:

【中文标题】Grails 多列索引【英文标题】:Grails multi column indexes 【发布时间】:2010-12-03 09:59:51 【问题描述】:

谁能解释如何在 Grails 中定义多列索引?文档充其量是稀疏的。

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

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

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

【问题讨论】:

【参考方案1】:

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

class ClassName 
    String name
    String description
    String state

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

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

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

【讨论】:

有什么方法可以设置复合索引顺序?【参考方案2】:

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

index:'Name_Idx, Address_Index'

带空格;它应该像

index:'Name_Idx,Address_Index'

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

【讨论】:

我已经尝试过(来自参考),但运气不错。它似乎很随机地工作。适用于一张桌子的东西在另一张桌子上会产生另一种结果。索引名称的约定是什么?是否必须为另一列定义“Address_Index” - 还是 Grails 神奇地发现它必须是“地址”字段的索引? @Kimble,我不认为命名有什么神奇之处(尽管文档 的实现确实令人困惑,我不能一定)。 这个“没有空间”的 bug 让我很生气【参考方案3】:

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

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

static mapping = 
      name index:'name_idx'

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

【讨论】:

【参考方案4】:

我需要能够控制我的多列索引中列的顺序并使其独一无二。我通过使用直接 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);")
    

【讨论】:

这可能更适合DB Migration 插件而不是引导程序。

以上是关于Grails 多列索引的主要内容,如果未能解决你的问题,请参考以下文章

Grails 添加域字段作为数据库索引

Grails 可搜索插件

Grails 中的链控制器操作 [关闭]

从 Grails RestfulController 索引/搜索操作中渲染元数据以进行分页

Grails - 使用路由隐藏 /index 操作

Grails 单元测试问题