Временное свойство в домене Grails

У меня есть домен Grails под названием People, и я хочу проверить, есть ли у каждого People дочерние элементы. Childs — это другие объекты People. Вот моя структура домена:

class People implements Serializable {

    static constraints = {
        name (nullable : false, unique : true)
        createdBy (nullable : false)
        creationDate (nullable : false)
    }

    static transients = ['hasChild']

    static mapping = {
        table 'PEOPLE'
        id generator: 'sequence', params : [sequence : 'SEQ_PK_ID']
        columns {
            id column : 'APEOPLE_ID'
            parentPeople column : 'PARENT_PEOPLE_ID'
        }
        parentPeople lazy : false
    }

    People parentPeople
    String name
    String description

    Boolean hasChild() {
        def childPeoples = People.createCriteria().count { 
            eq ('parentPeople', People) 
        }
        return (childPeoples > 0)
    }
}

Но я нигде не могу вызывать people.hasChild(). Не могли бы вы помочь мне в этом? Большое спасибо!


person Đinh Hồng Châu    schedule 22.03.2011    source источник


Ответы (2)


Это потому, что в eq ('parentPeople', People) Grails не может понять, что такое "люди" (это класс). Вы должны заменить «Люди» на this. Например:

static transients = ["children"]

    def getChildren() {
        def childPeoples = People.findAllByParentPeople(this, [sort:'id',order:'asc'])
    }
person Hoàng Long    schedule 22.03.2011
comment
Можете ли вы также выполнить сеттер? - person John Giotta; 21.12.2012

Другой способ получить тот же результат — использовать Именованные запросы. Он кажется более лаконичным и создан специально для этой цели. Мне он также нравится, потому что он соответствует шаблону статических объявлений в модели предметной области и, по сути, является критерием, который я использую во всех своих приложениях. Объявление переходного процесса, а затем написание закрытия кажется чем-то вроде обходного пути, когда вы можете объявлять именованные запросы ... просто мое мнение.

Попробуйте что-то вроде этого:

static namedQueries = {
    getChildren {
        projections {
            count "parentPeople"
        }
    }
}
person CheddarMonkey    schedule 11.06.2014