Memetakan beberapa objek domain ke tabel yang sama menggunakan GORM DSL

Saya membuat aplikasi grails melalui database lama.
Ada tabel di mana saya ingin membuat beberapa objek domain berbeda (Tipe1, Tipe2, dan Tipe3 dalam contoh saya di bawah).
Tabelnya seperti ini :

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
...

Jadi saya ingin membuat 3 kelas domain berbeda, masing-masing berisi bidang bernama "deskripsi", dan sesuai dengan "tipe" tertentu, karena baris-barisnya mewakili konsep yang berbeda.

Apakah ada batasan yang memungkinkan saya memfilter baris berdasarkan jenis?

Maksudku, bisakah aku melakukan sesuatu seperti:

class Type1 {
    String type
    String description

    static mapping = {
       table 'mytable'
    }

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

 }

Lalu saya berharap Type1.list() menghasilkan kueri seperti:

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

Memperbarui :

Sebenarnya dokumentasi mengatakan bahwa saya dapat menggunakan diskriminator untuk mencapai ini.

Namun, saya mencoba mengatur kelas saya sebagai berikut:

class Type1 extends BaseType {

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

}

Saya mengaktifkan penelusuran SQL hibernasi, dan bukannya melihat

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

Jadi begitu

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

Tampaknya diskriminator sepenuhnya mengabaikan nama kolom khusus saya :-(

Saya menggunakan Grails 1.2.1


person Philippe    schedule 04.03.2010    source sumber


Jawaban (2)


Oke, jadi dokumentasi Grails tidak mutakhir (seharusnya).

Solusinya adalah:

Di kelas BaseType :

static mapping = { discriminator column:"type" }

Di subkelas :

static mapping = { discriminator value:"type1" } // or type2, type3, etc...
person Philippe    schedule 04.03.2010

Dokumentasi GORM sepertinya menyarankan Anda bisa, asalkan semua kelas TypeX Anda memperluas kelas dasar yang umum

person tim_yates    schedule 04.03.2010
comment
Ya, saya mencobanya... tetapi meja saya tidak memiliki kolom 'kelas'... Saya akan mencoba memetakan kolom TYPE ke diskriminator kelas dan melihat apakah itu berhasil... - person Philippe; 04.03.2010