Duvida com Iteração
28/11/2012 18:38
0
E ai pessoal tudo bem?

Tenho 1 dominio assim:


class A{
...
static hasMany = [letras: B]
...
}

class B{
...
static hasMany = [letras: C]
...
}


Eu queria reunir a partir do item A.letras iterar todas as instancias de B fazendo uma variavel receber suas 'letras' do tipo C. (meio complicado né? rs)

eu tentei:

def todosB
def todosC

def listA = A.list()

listA.each(){
todosB = todosB + ${it.letras}
}

todosB.each(){
todosC = todosC + ${it.letras}
}



porem esta dando erro.

Alguém saberia como me ajudar?
Tags: each, iteração


0
Você pode usar HQL, não?

Algo como


def letras = A.executeQuery("select distinct a.letras.letras")


0
Oi Henrique!

Orbigado pela ajuda! Na verdade em cada etapa do each() os dados seriam trabalhados por isso a necessidade de fazer com each().

Você saberia me dizer o que fazer para iterar dessa maneira?
28/11/2012 20:30


1
Dica, evite eachs neste caso e opte pelo for tradicional.
Eachs geram closures, que por sua vez gerarão arquivos .class, que por sua vez irão comer seu espaço de memória permanente (permspace) sem necessidade.

No seu caso, eu usaria um conjunto de "fores" (como será que se fala for em plural? :)) aninhados como no exemplo abaixo


for (a in as) {
for (b in a.letras) {
for (c in b.letras) {

}
}
}


0
Obrigado pela dica Henrique!

Não sabia desse detalhe. Mandei centralizar em uma variavel todas as coleções e agora não consigo percorer a list.

Vou explicar melhor. Fiz o seguinte:

def cont   //será uma lista de B's

for (a in as) {

if(a.letras.size() > 5){
if(cont){

cont = cont + a.letras // vai incrementando a variavel

}else{

cont = a.letras // recebe a primeira variavel

}
}

List<B> cont2
for (b in cont) {

if(b.nome == "OK"){

if(cont2){

cont2 = cont2 + B.finByNome("OK")

}else{
cont2 = B.finByNome("OK") // Ocorre erro dizendo que não pode inserir o tipo B na em um java.util.List
}
}
}
}



O tipo de classe gerada com o conjunto de arrays oriundos dos hasMany é do tipo java.util.LinkedHashSet que me parece que é uma list indexada e ordenada pela ordem de inserção.

Tentei acessar os itens da lista com cont[1], mas também dá erro. Tentei cont.get(1) e também deu erro.

Estudei a classe porém não achei nenhum método que me permite manipular os objetos de sua lista.

Daí surgiram 2 duvidas brutais:

Como faço para acessar e manipular o objeto dessa Lista?

Como faço para criar uma lista de objetos do tipo 'B' que podem ser manipulados e referenciados? É com o List<B> mesmo ou tem algum outro comando?
28/11/2012 23:57


0
Alguma idéia de como resolver isso pessoal?


30/11/2012 14:43


0
Olá, Ilmom

Amigo, acredito que a linha
 cont2 = B.finByNome("OK")

esteja errada porque deveria estar
 cont2 = B.findAllByNome("OK")

Se você deseja buscar apenas 1 mesmo do banco e adicioná-lo a lista, deve então ser
 cont2 += B.findlByNome("OK")


No mais, minha sugestão de refatorar teu código:


def cont = [] //será uma lista de B's

for (a in as) {

if(a.letras.size() > 5){
cont += a.letras // basta isso se inicializar o "cont" como acima
}

List<B> cont2 = []
for (b in cont) {

if(b.nome == "OK"){
cont2 += B.findByNome("OK") // caso queira buscar só 1 do banco
cont2 += B.findAllByNome("OK") // caso queira buscar vários do banco
}
}
}


0
Errata:
onde está
cont2 += B.findlByNome("OK")

leia-se
cont2 += B.findByNome("OK")



0
Muito obrigado José!

Observei que com o seu exemplo os finders dinamicos retornam uma lista do tipo Array com a capacidade de ser manipulada.

Ainda não descobri porque aquele LinkedHashSet não permite ser manipulado, mas pra mim resolvendo o problema é que é o importante.

Valeu pela ajuda!

Abraço a todos...
03/12/2012 22:36



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