Powered by Max Banner Ads 
Home > Hibernate, JSF > Busca com Hibernate Annotation + JSF

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!!

Related Posts with Thumbnails
  1. December 27th, 2009 at 19:12 | #1

    Parabéns pelo post, bem simples e direto. Muito bom.

  2. camilolopes
    December 28th, 2009 at 03:52 | #2

    olá Valdemar,

    obrigado por comentar e por ter acessado o blog. Feliz ano novo para vc!

    abraco.

  3. Roberto Azevedo e Rodrigues
    May 22nd, 2010 at 00:58 | #3

    Por favor se for possivel informar a funcionalidade do “model” no exemplo 2 mostrado.

  4. camilolopes
    May 22nd, 2010 at 07:37 | #4

    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.

  5. Roberto Azevedo e Rodrigues
    May 26th, 2010 at 07:37 | #5

    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?

  6. May 26th, 2010 at 07:44 | #6

    olá Roberto, para ser sincero nao entendi direto sua pergunta, poderia ser mais especifico?

    abracos,

  7. Roberto Azevedo e Rodrigues
    May 26th, 2010 at 07:50 | #7

    Camilo,

    Nesse exemplo você lista os nomes em outra página, como faço pra listar em uma tabela na mesma página?

  8. May 26th, 2010 at 07:59 | #8

    opa! Roberto,
    vc vai precisar usar template do facelets para isso, dar uma pesquisada a respeito.

    abracos,

  9. Roberto Azevedo e Rodrigues
    May 26th, 2010 at 08:12 | #9

    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()
    )

  10. May 26th, 2010 at 08:23 | #10

    opa! Roberto,

    Nao se preocupe, esse é o objetivo dos posts, discussao :D . 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,

  11. Roberto Azevedo e Rodrigues
    May 26th, 2010 at 08:42 | #11

    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.

  12. May 26th, 2010 at 08:48 | #12

    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,

  13. Roberto Azevedo e Rodrigues
    May 26th, 2010 at 08:54 | #13

    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!

  14. May 26th, 2010 at 08:58 | #14

    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,

  15. Roberto Azevedo e Rodrigues
    May 27th, 2010 at 06:21 | #15

    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?

  16. camilolopes
    May 28th, 2010 at 07:54 | #16

    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,

  17. Roberto Azevedo e Rodrigues
    May 29th, 2010 at 03:12 | #17

    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.

  18. Renato
    May 2nd, 2011 at 21:35 | #18

    Olá Camilo. Você pode me ajudar a fazer uma pesquisa com Filtro em JSF2.0+Hibernate? Minha Aplicacao mostra todos os resultados, gostaria de colocar um filtro por Titulo. (É APENAS UM CADASTRO BASICO POIS ESTOU ESTUDANDO). Obrigado

    LivroDao.java
    —————————————————
    package Dao;

    import Model.Livro;
    import java.util.List;

    public interface LivroDao {

    public void save(Livro livro);
    public Livro getLivro(long id);
    public List list();
    public void remove(Livro livro);
    public void update(Livro livro);

    }

    —————————————————-
    LivroDaoImp.java

    package Dao;

    import Model.Livro;
    import Utils.HibernateUtil;
    import java.util.List;
    import org.hibernate.Session;
    import org.hibernate.Transaction;

    public class LivroDaoImp implements LivroDao {

    public void save(Livro livro) {
    Session session = HibernateUtil.getSessionFactory().openSession();
    Transaction t = session.beginTransaction();
    session.save(livro);
    t.commit();
    }
    public Livro getLivro(long id) {
    Session session = HibernateUtil.getSessionFactory().openSession();
    return (Livro) session.load(Livro.class, id);
    }
    public List list() {
    Session session = HibernateUtil.getSessionFactory().openSession();
    Transaction t = session.beginTransaction();
    List lista = session.createQuery(“from Livro”).list();
    t.commit();
    return lista;
    }

    public void remove(Livro livro) {
    Session session = HibernateUtil.getSessionFactory().openSession();
    Transaction t = session.beginTransaction();
    session.delete(livro);
    t.commit();
    }
    public void update(Livro livro) {
    Session session = HibernateUtil.getSessionFactory().openSession();
    Transaction t = session.beginTransaction();
    session.update(livro);
    t.commit();
    }

    }
    ———————————————————–
    LivroController.java

    package Controller;

    import Dao.LivroDao;
    import Dao.LivroDaoImp;
    import Model.Livro;
    import java.util.List;
    import javax.faces.bean.ManagedBean;
    import javax.faces.bean.SessionScoped;
    import javax.faces.model.DataModel;
    import javax.faces.model.ListDataModel;

    @ManagedBean
    @SessionScoped
    public class LivroController {

    private Livro livro;
    private DataModel listaLivros;

    public DataModel getListarLivros() {
    List lista = new LivroDaoImp().list();
    listaLivros = new ListDataModel(lista);
    return listaLivros;
    }

    public Livro getLivro() {
    return livro;
    }

    public void setLivro(Livro livro) {
    this.livro = livro;
    }

    public String prepararAdicionarLivro(){
    livro = new Livro();
    return “gerenciarLivro”;
    }

    public String prepararAlterarLivro(){
    livro = (Livro)(listaLivros.getRowData());
    return “gerenciarLivro”;
    }

    public String excluirLivro(){

    Livro livroTemp = (Livro)(listaLivros.getRowData());
    LivroDao dao = new LivroDaoImp();
    dao.remove(livroTemp);
    return “gerenciarLivro”;

    }

    public String adicionarLivro(){

    LivroDao dao = new LivroDaoImp();
    dao.save(livro);
    return “gerenciarLivro”;

    }

    public String alterarLivro(){

    LivroDao dao = new LivroDaoImp();
    dao.update(livro);
    return “gerenciarLivro”;

    }

    public String limpar() {
    // cria um livro novo sem nada preenchido
    Livro livroParaUpdate = new Livro();
    // se havia um id na sessão, copia para o novo livro
    // assim deve funcionar tanto para adicao quanto update
    if (getLivro() != null) {
    livroParaUpdate.setId(getLivro().getId());
    }
    // substitui o livro antigo na sessão com tudo preenchido pelo livro novo em branco
    setLivro(livroParaUpdate);

    return “gerenciarLivro”;
    }

    }
    —————————————————————-
    Pagina JSF: gerenciarLivro.xhtml