有人可以解释如何在Grails中定义多列索引吗?文档最多是稀疏的。
这例如似乎根本不起作用: http://grails.org/GORM+Index+definitions
我对此有一些好运,但结果似乎是随机的。在一个域类中起作用的定义在应用于另一个域时不会(当然具有不同的名称)。 http://www.grails.org/doc/1.1/guide/single.html#5.5.2.6%20Database%20Indices
一些工作示例和解释将受到高度赞赏!
答案 0 :(得分: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”的索引,其索引中包含三列。
下行:列按字母顺序列在索引中,而不是输入的顺序。
答案 1 :(得分:6)
要使索引成为多列,请使用逗号分隔符列出列(注意,逗号后面没有空格,以避免使用this bug。您指向的第二个URL会出现错误,如下所示:
index:'Name_Idx, Address_Index'
有空间;它应该工作
index:'Name_Idx,Address_Index'
您指向的第一个网址是建议的更改(我不相信它目前正在实施,也不知道它有多大可能发生。)
答案 2 :(得分:3)
AFAIK,显示的index
闭包here从未实现过,因此应忽略这些示例(此页面用于讨论可能的实现,而不是记录实际的实现)。
为name_idx
属性定义单列索引name
的正确方法是
static mapping = {
name index:'name_idx'
}
很抱歉,但我不知道如何定义多列索引,如果您在此处没有得到答案,请尝试Grails mailing list。如果不能在域类中直接声明多列索引,则可以在SQL文件中定义它们,如果它们尚不存在(或删除并重新创建它们),则创建它们。此SQL文件可以由init
Bootstrap.groovy
闭包执行
答案 3 :(得分: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);")
}