Pesquisa entidade pai por critério de entidade filha, relação one-to-many e many-to-many
09/07/2012 16:49
0

Prezados,
Como dará para ver sou novato em grails, ainda não sei como o GORM mapeia todas as relações entre entidades.
Preciso fazer uma consulta onde as entidades "pai" serão escolhidas por critérios testados na entidade "filha".

Por exemplo:

class Contato {

String nome
static hasMany = [telefones:Telefone]
}

class Telefone {

static belongsTo = Contato

String codArea
String numero
}


Um form envia: params.codArea, params.numero


Como obter a coleção de contatos que tenham o mesmo número de telefone e codigo de área? Algo do tipo:


def telefones = Telefone.findAllByCodAreaAndNumero(params.codArea, params.numero)
def contatos = Contato.findAllByContatoInList(telefones)


E se a relação fosse many-to-many? Como asseguir:

class Telefone {

static belongsTo = Contato
static hasMany = [contatos:contato]

String codArea
String numero
}
Tags: many to many, one to many, findall child parent collection


0
Oi André,

neste caso as criterias salvam o seu dia.
Você poderia escrever uma consulta como a abaixo:


Telefone.withCriteria {
eq('codArea', '3838')
eq('numero', '38383838')
projections {
distinct('contato')
}
}


Este código vai te retornar apenas os contatos relacionados à entidade filha.

Outra opção seria usando HQL mesmo. Poderia ser implementada uma consulta como o código abaixo:


def codArea = '08338'
def numero = '4984848'
Telefone.executeQuery("select distinct t.contato from Telefone c where c.codArea = ? and c.numero = ?", [codArea, numero])




1
Você também pode adicionar os critérios de dos contatos dessa maneira:

Contato.withCriteria({
telefones {
eq('codArea', '043')
}
})


A pesquisa acima vai trazer apenas os Contatos com telefones da área 43.
09/07/2012 17:54


0
Muito obrigado pela presteza na resposta.
Não abusando, mas ainda fica uma dúvida:

Em 1-to-m, "contato" em Telefone é a foreingkey com o Id de Contato?

Se fosse m-to-m, "contatos" seria um Set de Contato em Telefone, como faria a mesma pesquisa?



1
Oi André,

exatamente.


0
Sim o hibernate faz o join das chaves. Para verificar as querys usadas pelo hibernate adicione no DataSource.groovy:

environments {
development {
dataSource {
loggingSql = true
}
}
}


Se estiver no 'static hasMany = [contatos:Contato]' vai usar: contatos { }, se estiver no 'static hasMany = [telefones:Telefone]' dai é telefones { }
09/07/2012 19:54


0
Prezados,
Muito obrigado pela resposta.
Obtive sucesso.



Ainda não faz parte da comunidade???

Para se registrar, clique aqui.


Aprenda Groovy e Grails com a Formação itexto!

Newsletter Semana Groovy

Assinar

Envie seu link!


Livro de Grails


/dev/All

Os melhores blogs de TI (e em português) em um único lugar!

 
Creative Commons
RSS Grails Brasil é mantido por itexto Consultoria.
Em caso de problemas contacte Henrique Lobo Weissmann (Kico) por e-mail: kico@itexto.com.br
Todo o conteúdo presente neste site adota o Creative Commons como licença padrão.
Ver: 4.14.0
itexto