Propiedad transitoria en el dominio de Grails
dns transient (2)
Tengo un dominio de Grails llamado People, y quiero verificar que cada persona tenga hijos o no. Los niños son otros objetos de personas. Aquí está mi estructura de dominio:
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)
}
}
Pero no puedo llamar a people.hasChild () en ninguna parte. ¿Podrías por favor ayudarme en esto? Muchas gracias!
Es porque en eq (''parentPeople'', People)
, Grails no puede entender qué es ''People'' (es una clase). Deberías reemplazar a "Gente" por this
. Por ejemplo:
static transients = ["children"]
def getChildren() {
def childPeoples = People.findAllByParentPeople(this, [sort:''id'',order:''asc''])
}
Otra forma de obtener el mismo resultado es usar consultas con nombre . Parece más conciso y fue creado específicamente para este propósito. También me gusta porque se ajusta al patrón de declaraciones estáticas en un modelo de dominio y es esencialmente un criterio, que utilizo en todas mis aplicaciones. Declarar un transitorio y luego escribir una clausura parece un poco problemático cuando puedes declarar consultas con nombre ... solo mi opinión.
Pruebe algo como esto:
static namedQueries = {
getChildren {
projections {
count "parentPeople"
}
}
}