Отображение нескольких объектов домена в одну таблицу с помощью GORM DSL - PullRequest
3 голосов
/ 04 марта 2010

Я создаю приложение 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 разных класса домена, каждый из которых содержит поле с именем «description» и соответствует определенному «типу», поскольку строки представляют разные концепции.

Есть ли какое-либо ограничение, позволяющее фильтровать строки по типу?

Я имею в виду, могу ли я сделать что-то вроде:

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

Ответы [ 2 ]

5 голосов
/ 04 марта 2010

Хорошо, так что документация Grails не обновлена ​​( хотя должно ).

Решение:

В классе BaseType:

static mapping = { discriminator column:"type" }

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

static mapping = { discriminator value:"type1" } // or type2, type3, etc...
0 голосов
/ 04 марта 2010

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

...