Сопоставление нескольких объектов домена с одной и той же таблицей с помощью GORM DSL

Я создаю приложение Grails для устаревшей базы данных.
Есть таблица, из которой я хотел бы создать несколько различных объектов домена (тип 1, тип 2 и тип 3 в моем примере ниже).
Таблица выглядит примерно так. это :

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


person Philippe    schedule 04.03.2010    source источник


Ответы (2)


Итак, документация по Grails устарела (но должна).

Решение:

В классе BaseType:

static mapping = { discriminator column:"type" }

В подклассах:

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

Документация GORM, кажется, предполагает, что вы можете, если все ваши классы TypeX расширяют общий базовый класс

person tim_yates    schedule 04.03.2010
comment
Да, я пытаюсь это сделать... но в моей таблице нет столбца "класс"... Я попытаюсь сопоставить столбец TYPE с дискриминатором классов и посмотреть, работает ли это... - person Philippe; 04.03.2010