3

レガシー データベース上に grails アプリを作成しています。
いくつかの異なるドメイン オブジェクト (以下の例では Type1、Type2、および Type3) を作成したいテーブルがあります。
テーブルは次のようになります。

ID    TYPE    DESCRIPTION
1     type1   description of a type1 object
2     type1   description of another type1 object
3     type2   description of a type2 object
4     type3   description of a type3 object
...

行が異なる概念を表すため、それぞれが「説明」という名前のフィールドを含み、特定の「タイプ」に対応する 3 つの異なるドメイン クラスを作成したいと思います。

行をタイプ別にフィルタリングできるような制約はありますか?

つまり、次のようなことができますか:

class Type1 {
    String type
    String description

    static mapping = {
       table 'mytable'
    }

    static constraints = { type == 'type1' } // Is there anything like this ?

 }

次に、 Type1.list() が次のようなクエリを生成することを期待します。

SELECT type, description 
FROM mytable
WHERE type = 'type1'

アップデート :

実際、ドキュメントには、これを実現するためにディスクリミネーターを使用できると書かれています。

ただし、次のようにクラスを設定しようとしました:

class Type1 extends BaseType {

  static mapping = {
    discriminator column:'type', value: 'type1'
  }

}

休止状態の SQL トレースを有効にしましたが、代わりに

SELECT ... FROM mytable WHERE type = 'type1'

そうですか

SELECT ... FROM mytable WHERE class = 'type1'

ディスクリミネーターが私のカスタム列名を完全に無視しているようです:-(

Grails 1.2.1 を使用しています

4

2 に答える 2

5

わかりましたので、Grails のドキュメントは最新ではありません (そうである必要があります)。

解決策は次のとおりです。

BaseType クラス:

static mapping = { discriminator column:"type" }

サブクラスでは:

static mapping = { discriminator value:"type1" } // or type2, type3, etc...
于 2010-03-04T17:01:24.120 に答える
0

GORM ドキュメントは、すべての TypeX クラスが共通の基本クラスを拡張する限り、できることを示唆しているようです。

于 2010-03-04T14:18:37.590 に答える