2009-10-02 90 views

回答

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”与索引三列的索引。

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

3

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

正确的方法来定义一个单列索引name_idxname属性

static mapping = { 
     name index:'name_idx' 
} 

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

5

执行,以使您的索引多列,列出与逗号分隔符(注意,逗号后没有空间,列避免this bug。你点命中的第二个网址该bug,因为它说:

index:'Name_Idx, Address_Index' 

与空间;它应该工作作为

index:'Name_Idx,Address_Index' 

您指向了一个建议改变的第一个URL(我不相信这是当前实现,并有没有ide它的可能性有多大)。

+0

我试过了(来自参考文献)以各种运气。它似乎非常随机地工作。对一张桌子起作用的东西在另一张桌子上给出另一个结果。 什么是索引名称的约定?是否需要为另一列定义“Address_Index” - 或者Grails是否奇迹般地发现它必须是“地址”字段的索引? – Kimble 2009-10-11 11:44:38

+0

@Kimble,我并不认为命名中有任何魔术(尽管无可否认文档和实现足够混乱,我不能确定)。 – 2009-10-11 16:19:01

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

这可能会更适合[DB迁移](http://grails.org/plugin/database-migration)插件而不是引导程序。 – cdeszaq 2012-12-10 14:50:38