有人可以解释如何在 Grails 中定义多列索引吗?文档充其量是稀疏的。
例如,这似乎根本不起作用:http: //grails.org/GORM+Index+definitions
我对此有一些运气,但结果似乎充其量是随机的。在一个域类中有效的定义在应用于另一个域类时不起作用(当然名称不同)。 http://www.grails.org/doc/1.1/guide/single.html#5.5.2.6%20Database%20Indices
一些工作示例和解释将不胜感激!
有人可以解释如何在 Grails 中定义多列索引吗?文档充其量是稀疏的。
例如,这似乎根本不起作用:http: //grails.org/GORM+Index+definitions
我对此有一些运气,但结果似乎充其量是随机的。在一个域类中有效的定义在应用于另一个域类时不起作用(当然名称不同)。 http://www.grails.org/doc/1.1/guide/single.html#5.5.2.6%20Database%20Indices
一些工作示例和解释将不胜感激!
对我来说适用于多列索引的解决方案是:
class ClassName {
String name
String description
String state
static mapping = {
name index: 'name_idx'
description index: 'name_idx'
state index: 'name_idx'
}
}
这将创建一个名为“name_idx”的索引,其中包含索引中的三列。
缺点:这些列按字母顺序在索引中列出,而不是按输入的顺序列出。
要使索引为多列,请使用逗号分隔符列出列(请注意,逗号后没有空格,以避免出现此错误。您指向的第二个 URL 会遇到错误,正如它所说:
index:'Name_Idx, Address_Index'
有空格;它应该作为
index:'Name_Idx,Address_Index'
您指向的第一个 URL 是一个提议的更改(我不相信它目前已实施,也不知道它的可能性有多大)。
AFAIK,此处index
显示的闭包从未实现,因此应忽略这些示例(此页面用于讨论可能的实现,而不是记录实际实现)。
name_idx
为name
属性定义单列索引的正确方法是
static mapping = {
name index:'name_idx'
}
抱歉,但我不知道如何定义多列索引,如果您在这里没有得到答案,请尝试Grails 邮件列表。万一不能在域类中直接声明多列索引,您可以在 SQL 文件中定义它们,如果它们不存在则创建它们(或删除并重新创建它们)。这个 SQL 文件可以通过init
闭包来执行Bootstrap.groovy
我需要能够控制我的多列索引中列的顺序并使其独一无二。我通过使用直接 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);")
}