Busca com Hibernate Annotation + JSF
![]()
olá Pessoal,
Neste post resolvi, apresentar um recurso bem simples que temos no hibernate usando a linguagem HQL. Tendo como exemplo aplicação construida no post anterior: Hibernate+ Annotations, iremos apenas neste post criar 2 paginas JavaServerFaces – JSF, e alterar alguns arquivos .java para implementar um sistema de busca no sistema. A ideia aqui é mostrar a facilidade que o framework possibilita, sem falar que nao precisa modificar quase nada do que ja foi construido, apenas adicionar os novos recursos.
Lets go…
Requisitos:
É necessário ter implementado os posts abaixo, sobre hibernate. Aqui vamos apenas dar continuidade aplicação ja desenvolvida.
JSF + Hibernate + MySql no Eclipse
Hibernate Annotations + JSF + MySql
Desenvolvendo
1. Primeiro passo é atualizar a class NewsDAO.java inserindo o metodo que será responsavel por fazer a busca no BD.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | //realiza a pesquisa no BD public List consultar(String letter){ session = ConexaoFactory.getInstance(); /*para entender o HQL o from abaixo será seu bean * o l eh como se fosse o ? que temos o sql usando *o PreparedStatement apos o where temos o campo *de pesquisa que eh a coluna na tabela * paraemtro da query para pesquisa do hibernate */ Query query = session.createQuery("from NewsLetter l where l.nome like :letter"); List list = query.setString("letter", "%"+letter+"%").list(); return list;} |
2.Agora vamos criar o metodo responsável por obter os dados no BD e armazenar esses dados em um DataModel, para facilitar a busca. Para isso temos que alterar nossa classe controladora NewsControler.java
1 2 3 4 5 6 7 8 9 10 | /*metodo que armazena o retorno da pesquisa em * DataTable,de acordo o retorno do metodo * de pesquisa */ public DataModel getBuscar(){ NewsDAO newsdao = new NewsDAO(); /* chamando o metodo de pesquisa * e passando o valor da campo digitado */ model = new ListDataModel(newsdao.consultar(keynome)); return model; } |
3.Agora criaremos as paginas JSF, a primeira tem o campo de busca, a segunda traz o resultado da busca.
1 2 3 4 5 6 7 8 9 10 11 | <f:view> <h:form> <h:panelGrid> <f:facet name="header"> <h:outputText value="Informe o nome do usuário para pesquisa" /> </f:facet> <h:inputText value="#{newsControler.keynome}" id="nome" /> </h:panelGrid> <h:commandButton value="Pesquisar" action="pesquisar"/> </h:form> </f:view> |
4.Página JSF que exibi o resultado da busca exibirpesquisa.jsp(nao esqueça de importar os tagslib para o JSF.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | …. <f:view> <h:form> <h:dataTable value="#{newsControler.buscar}" var="us" cellpadding="2" cellspacing="0"> <h:column> <f:facet name="header"> <h:outputText value="Id"/> </f:facet> <h:outputText value="#{us.id}"/> </h:column> <h:column> <f:facet name="header"> <h:outputText value="nome do usuario"/> </f:facet> <h:outputText value="#{us.nome}"/> </h:column> </h:dataTable> </h:form> </f:view> |
Atualizando faces-config.xml
Deixe seu arquivo faces-config.xml conforme abaixo.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | <managed-bean> <managed-bean-name>newsControler</managed-bean-name> <managed-bean-class>br.com.controler.NewsControler </managed-bean-class> <managed-bean-scope>session</managed-bean-scope> </managed-bean> <navigation-rule> <display-name>news</display-name> <from-view-id>/news.jsp</from-view-id> <navigation-case> <from-outcome>salvar</from-outcome> <to-view-id>/sucesso.jsp</to-view-id> </navigation-case> </navigation-rule> <navigation-rule> <display-name>buscar</display-name> <from-view-id>/buscar.jsp</from-view-id> <navigation-case> <from-outcome>pesquisar</from-outcome> <to-view-id>/exibipesquisa.jsp</to-view-id> </navigation-case> </navigation-rule> </faces-config> |

Testando
Agora vamos testar a nossa busca, abaixo temos a imagem do nosso BD com alguns newsletter cadastrados, assim podemos nos certificar que a busca trouxe o elemento correto.


Abraço a todos e espero que tenham gostado do post!. Até o próximo pessoal!!
_20100519011102.gif)
Parabéns pelo post, bem simples e direto. Muito bom.
olá Valdemar,
obrigado por comentar e por ter acessado o blog. Feliz ano novo para vc!
abraco.
Por favor se for possivel informar a funcionalidade do “model” no exemplo 2 mostrado.
olá Roberto,
Ele vai armazenar o resultado que vem de uma pesquisa. Ou seja, se mando bsucar todos os clientes com idade > 25 eles vai retornar e terei isso em um DataModel, que posso usar em datatable para exibir o resultado da pesquisa. Pensei nele como um ArrayList de objetos vindo do BD.
flw, abracos.
Camilo na minha aplicação Keynome esta dando erro no controlador e não esta aparecendo pra mim no codigo html, por exemplo <value "#{controlador.keynome}" o que fazer pra resolver?
olá Roberto, para ser sincero nao entendi direto sua pergunta, poderia ser mais especifico?
abracos,
Camilo,
Nesse exemplo você lista os nomes em outra página, como faço pra listar em uma tabela na mesma página?
opa! Roberto,
vc vai precisar usar template do facelets para isso, dar uma pesquisada a respeito.
abracos,
Camilo,
Me desculpe por estar incomodando cara, essa linha <h:dataTable value="#{newsControler.buscar}" var="us", o buscar vc declarou aonde? ou ele é do DataModel? porque esta dando erro aqui 500 na minha aplicação.
(javax.faces.FacesException: #{Secretaria.buscar}: javax.el.MethodNotFoundException: /consulta.xhtml @28,119 action="#{Secretaria.buscar}": Method not found: secretaria.faces.Secretaria@15a740a.buscar()
)
opa! Roberto,
Nao se preocupe, esse é o objetivo dos posts, discussao
. Bem o buscar ele retorna um Datamodel sim veja lá getBuscar, porem no JSF temos que tirar o prefix get e converter para minusculo a primeira letra do metodo.
Veja o metodo em acao no ponto 2 do ponto.
A essencia deste post eh o ponto 1 e 2, o segredo está ai, o resto nao tem nada critico.
abracos,
Ultima pergunta, depois de clicar no buttom “Pesquisar” como faço pra limpar o nome digitado do inputTex pra pesquisar outro nome?
Cara muito obrigado pelo exemplo e pela sua atenção conseguri testar e estar funcionando.
opa! Roberto,
Vc vai dar que dar um new para o bean no seu controlador. Algo como:
public String limpar(){
bean = new bean();
return “limpar”;
Assim ele retorna para o valor padrao do bean, que se for uma String eh recomendado ter colocado String nome = “”; por exemplo.
Ou vc pode mudar seu managebean de session para request.
abracos,
Camilo eu não entendir!
Olha só, digitei “Roberto” cliquei no pesquisar, listou Roberto, como faço pra apagar o Roberto que foi digitado? pra pesquisar outro nome, entendeu!
opa! Roberto, vc está listando na mesma página? Se sim, tem que ver como apagar os dados do bean apos ter sido enviado. Agora se estive em outra pagina a exibicao, mude de session, la no managebean para request.
abracos,
Camilo conseguir implementar a pesquisa com seu modelo. Mais estou agora com duas ( codigo e nome), quando o usuario for fazer uma pesquisa ele tem que primeiro selecionar umas das opções radio e digitar (nome se for selecionado o radio “nome”) e codigo se for selecionado (codigo), no meu bean inserir os teste com if abaixo do (public DataModel getBuscar()). Inserir os teste com if mais não esta funcionando posso enviar o meu codigo pra você analizar?
olá Roberto,
ah entendi, vc vai ter que passar o que foi selecionado para o seu HQL ou criteria. ja que seu botao tem um campo onde vc especifica o valor e o nome dele. Vc nao precisa de IF, é so passar o que foi digitado + a opcao escolha para a query de busca.
Bem, se eu pedir para vc mandar o code, vou criar falsas esperancas que vou analisar e vc vai ficar aguardando, e para ser sincero, o tempo anda tao curto, que nao sei se ia conseguir analisar e ti dar um retorno. Peço desculpas a vc. Mas, é que estou na correira para conseguir entrar de ferias e tenho que deixar tudo ok.
abracos,
Camilo eu sou iniciante cara a possibilidade de postar um exemplo de como fazer isso por favor o meu codigo de consulta esta igual ao seu acima HQL e DataModel.