Como executar query no GRAILS?
05/10/2011 16:18
0
Boa tarde,

Sou iniciante em Grails e gostaria muito da ajuda de vocês.

Eu tenho as tabelas:

tabela: aluno
campos: cod_aluno, nome

tabela: notas
campos: cod_aluno, nota

tabela: materia
campos: cod_aluno, materia

E a query:

select a.nome, n.nota, m.materia
from aluno a, notas n, materia m
where a.cod_aluno = n.cod_aluno
and a.cod_aluno = m.cod_aluno

Já fiz os Domains e Controllers aluno, notas e materia.

Eu peço a ajuda de vocês, como eu faria a página de busca abaixo usando a query acima:

Criar uma pagina de busca bem simples:

BuscarAluno.gsp

Nela só teria o campo texto e o botão buscar passando o nome do aluno.

O que eu não sei programar é quando eu clicar no botão buscar ele executar a minha query.

E na mesma tela BuscarAluno.gsp, abaixo do campo busca, traria a tabela com as
colunas nome, nota e materia com o retorno da busca executada.

Eu não sei como colocar a query no Grails.

Obrigado


Tags: Executar query


0
Dê uma olhada em createCriteria que resolve o seu problema de busca:
http://www.grails.org/doc/latest/ref/Domain%20Classes/createCriteria.html
05/10/2011 16:40


0
Sobre o botão vc pode criar uma ação Pesquisar no seu controlador e vincular ela ao botão do form:
<g:actionSubmit class="pesquisar" action="pesquisar" value="Pesquisar" />
05/10/2011 16:43


0
Obrigado castiel, como sou novato, você teria um exemplo de criteria usando aquela minha query e essa query recebendo como parametro o nome do aluno?
Obrigado
05/10/2011 16:48


0
Oi Igor, eu já escrevi um post sobre isto uma vez.
Talvez te ajude. Segue o link: http://www.itexto.net/devkico/?p=885


0
Dá uma olhada nesses códigos:
https://github.com/mikemil/AjaxExamples
nesse repositório mostrar como fazer busca usando ajax, muito interessante.
05/10/2011 21:32


0
Olá KIKO, eu li a matéria que você escreveu, mas eu não entendi como que se faz o "join" nas tabelas.

Poderia por favor colocar um exemplo?

Obrigado
06/10/2011 07:54


0
Oi Igor,

no caso, o "join" é feito pelo GORM pra você. Vamos supor que eu tenha uma situação como a abaixo:

class Livro {
static hasMany = [autores:Autor]
}

class Autor {
String nome
}


Se eu quiser buscar todos os livros com base em um autor, eu poderia fazer um "join" como no exemplo abaixo:


Livro.withCriteria {
autor {
eq("nome", "Machado de Assis")
}
}




2
Para fazer via HQL (que se assemelha mais ao SQL, que você já está acostumado), segue:


def result = Aluno.executeQuery(
"select a.nome, n.nota, m.materia " +
" from Aluno a, Notas n, Materia m " +
" where a.codAluno = n.codAluno " +
" and a.codAluno = m.codAluno " +
" and a.nome = :nome ",
[nome: params.nome]
);


Onde params.nome é o que veio da sua view.
Lembrando, no HQL você faz referência aos nomes das classes/entidades de domínio e aos seus atributos, e não aos nomes das tabelas/campos do banco de dados.

De qualquer forma, acho interessante você estudar e aprender a usar a busca por critérios.
06/10/2011 10:00


0
Obrigado pessoal.

Mas ainda não consegui fazer a busca por criterio usando seu exemplo Henrique

Além dos domains e controllers Autor e Livro que criei para testar, criei a página busca.gsp.

o action da da pagina de busca que só tem o nome do autor, chama o filteredList. No controller da busca coloquei:

def filteredList = {
def listaFiltrada = buscaService.filterByParams(params)

render (view:'list', model:[personList:listaFiltrada,
params:params])
return
}

Service, coloquei o que o henrique passou:
def filterByParams(Map params) {
def listaFiltrada = Livro.withCriteria {
autor {
eq('nome', 'igor')
}
}

return listaFiltrada
}

Mas retorna erro:
Error 500: Executing action [filteredList] of controller [livraria.BuscaController] caused exception: groovy.lang.MissingMethodException: No signature of method: livraria.BuscaService.autor() is applicable for argument types: (livraria.BuscaService$_filterByParams_closure1_closure2) values: [livraria.BuscaService$_filterByParams_closure1_closure2@11eef55] Possible solutions: getLog(), wait(), dump(), any(), wait(long), getAt(java.lang.String)
Servlet: grails
URI: /livraria/grails/busca/filteredList.dispatch
Exception Message: No signature of method: livraria.BuscaService.autor() is applicable for argument types: (livraria.BuscaService$_filterByParams_closure1_closure2) values: [livraria.BuscaService$_filterByParams_closure1_closure2@11eef55] Possible solutions: getLog(), wait(), dump(), any(), wait(long), getAt(java.lang.String)
Caused by: No signature of method: livraria.BuscaService.autor() is applicable for argument types: (livraria.BuscaService$_filterByParams_closure1_closure2) values: [livraria.BuscaService$_filterByParams_closure1_closure2@11eef55] Possible solutions: getLog(), wait(), dump(), any(), wait(long), getAt(java.lang.String)
Class: BuscaController
At Line: [39]


Estou tentando fazer de exemplo o que o Henrique passou de Livro e Autor, mas a pesquisa
Livor.withCriteria {
autor {
eq('nome', 'igor')
}
}

Parece não funcionar, seria bem simples mesmo, a partir da pagina de busca, passar o nome do autor e retornar os livros que ele tem relacionamento.

Obrigado



06/10/2011 15:11


0
Igor,

vou te fazer uma pergunta boba: percebi que no seu exemplo inicial, você referencia entidades chamadas aluno, nota e matéria.

No exemplo que te passei, foi Livro e Autor. Você tem uma entidade Livro e outra chamada Autor no seu projeto? Porque se você não tem, e simplesmente copiou o meu exemplo, realmente não vai funcionar :)


0
Obrigado Henrique pela ajuda.

Eu fiz um teste criando um novo projeto usando o que vc passou, livro e autor.



Aí funcionou a pesquisa usando:
Livro.withCriteria {
autores {
eq("nome", "Machado de Assis")
}
}


Valeu pela ajuda
07/10/2011 15:18


0
Bom pessoal vendo aqui esta discursão e entrando essa criteria para busca eu coloco em qual arquivo no controller no doman ou na view do aplicativo??
05/11/2012 17:13



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