(Quick Reference)

discriminator

Purpose

Customizes the discriminator value used in table-per-subclass inheritance mapping.

Examples

class Content {
    …
}
class PodCast extends Content {
    …
    static mapping = {
        discriminator "audio"
    }
}

Description

Usage: discriminator(string/map)

Arguments:

  • column (optional) - The column name to store the discriminator
  • value - The value to use for the discriminator
  • formula (optional) - an SQL expression that is executed to evaluate the type of class. Use this or column but not both
  • type (optional defaults to string) - the Hibernate type, used for the where clause condition to know if it needs to wrap it with ' or not

By default when mapping inheritance Grails uses a single-table model so that all subclasses share the same table. A discriminator column is then used to help Grails tell what type a particular row is. By default the class name is stored as the value of this column. You can use the discriminator method to customize the value stored:

class Content {
    …
}
class PodCast extends Content {
    …
    static mapping = {
        discriminator "audio"
    }
}

You can also customize the discriminator column name:

class Content {
    …
    static mapping = {
        discriminator column:"content_type"
    }
}
class PodCast extends Content {
    …
    static mapping = {
        discriminator value: "audio"
    }
}

Or you can use a formula:

class Content {
    …
    static mapping = {
        discriminator value: "1", type: "integer",
            formula: "case when CLASS_TYPE in ('a', 'b', 'c') then 0 else 1 end"
    }
}
class PodCast extends Content{
    …
    static mapping = {
        discriminator value: "0"
    }
}