FindAll many-to-many
24/07/2016 16:09
0
Galera, estou começando a usar o Grails e gostaria de saber se tem como fazer cm o findall o que vou descrever abaixo.

possuo duas classes, receita e ingredientes com o relacionamento many - to many
então o Grails criou para mim a Tabela receitaIngredientes com o ID de receita e ingrediente

minha dúvida é como pesquisar uma lista de receitas passando cm parâmetro uma lista de ingredientes dessa receita.
Receita.findall [ovo,farinha,leite]
e me retornaria as receitas que possuem ou todos ingredientes da lista ou apenas alguns.
Tags: Grails, FindAll


0
De cabeça, sem testar, e baseado em alguns exemplos que pesquisei agora (Ou seja, zero garantia de que vai funcionar rsrsrs, mas deve servir como uma direção)

Receita.executeQuery('select r from Receita r where :ingrediente1 in elements(u.ingredientes) and :ingrediente2 in elements(u.ingredientes) ... :ingredienteN in elements(u.ingredientes)', [ingrediente1: ovo, ingrediente2; farinha, ...., ingredienteN: leite])

Uma outra forma seria, para cada ingrediente, consultar todas as receitas que utilizam aquele ingrediente, e aí calcular a interseção de todas as listas:
def receitasComFarinha = ...
def receitasComOvo = ...
def receitasComLeite = ...
def receitasComFarinhaOvoLeite = receitasComFarinha.intersect(receitasComOvo).intersect(receitasComLeite);

Obviamente os dois exemplos precisariam ser adaptados para o cenário onde a lista de ingredientes é dinamica, que provavelmente é o seu caso


0
Corrigindo:
select r from Receita r where :ingrediente1 in elements(r.ingredientes) and :ingrediente2 in elements(r.ingredientes) ... :ingredienteN in elements(r.ingredientes)', [ingrediente1: ovo, ingrediente2; farinha, ...., ingredienteN: leite]


0
Outra maneira seria o withCriteria. 

Exemplo (sem testar, mas como disse o colegaacima, pode te dar uma luz) :

def results = Receita.withCriteria {

eq "nome", "Pudim de leite"
 
ingredientes {
  in  "ovo", "açucar", "leite" // podendo ser um list com seus ingredientes (variavel também pode ir ai)
}
}


OU

def ingredientesList = ["ovo", "açucar", "leite"]

def results = Receita.withCriteria {

eq "nome", "Pudim de leite"
 
ingredientes {
  in  ingredientesList // podendo ser um list com seus ingredientes (variavel também pode ir ai)
}
}



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