15

Grails で複数列のインデックスを定義する方法を誰かが説明できますか? ドキュメントはせいぜいまばらです。

たとえば、これはまったく機能していないようです: http://grails.org/GORM+Index+definitions

これである程度運が良かったのですが、結果はせいぜいランダムに思えます。あるドメインクラスで機能する定義は、別のドメインクラスに適用すると機能しません (もちろん名前が異なります)。 http://www.grails.org/doc/1.1/guide/single.html#5.5.2.6%20Database%20Indices

いくつかの実用的な例と説明をいただければ幸いです。

4

4 に答える 4

17

複数列のインデックスでうまくいった解決策は次のとおりです。

class ClassName {
    String name
    String description
    String state

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

これにより、インデックスに 3 つの列を持つ「name_idx」という名前のインデックスが作成されます。

欠点: 列は、入力された順序ではなく、アルファベット順にインデックスにリストされます。

于 2010-04-22T19:50:15.550 に答える
6

インデックスを複数列にするには、列をカンマ区切りでリストします (このバグを回避するために、カンマの後にスペースを入れないことに注意してください。指定する 2 番目の URL は、次のようにバグにヒットします。

index:'Name_Idx, Address_Index'

スペース付き; それは次のように動作するはずです

index:'Name_Idx,Address_Index'

あなたが指摘した最初の URL は提案された変更でした (私はそれが現在実装されているとは思いませんし、実際に実装される可能性もわかりません)。

于 2009-10-10T23:37:19.267 に答える
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);")
    }
于 2011-09-18T16:14:28.387 に答える
3

私の知る限り、ここindexに示されているクロージャーは実装されていないため、これらの例は無視する必要があります (このページは、実際の実装を文書化するのではなく、可能な実装について説明するためのものです)。

プロパティの単一列インデックスを定義する正しい方法は次name_idxのとおりです。name

static mapping = {
      name index:'name_idx'
}

申し訳ありませんが、複数列のインデックスを定義する方法がわかりません。ここで回答が得られない場合は、 Grails メーリング リストを試してください。複数列のインデックスをドメイン クラスで直接宣言できないというまれなケースでは、それらがまだ存在しない場合はそれらを作成する (または削除して再作成する) SQL ファイルでそれらを定義できます。この SQL ファイルはinitBootstrap.groovy

于 2009-10-06T15:19:44.300 に答える