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 多列索引的主要内容,如果未能解决你的问题,请参考以下文章