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.

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

/*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.












4.Página JSF que exibi o resultado da busca exibirpesquisa.jsp(nao esqueça de importar os tagslib para o JSF.

….
















			

Atualizando faces-config.xml

Deixe seu arquivo faces-config.xml conforme abaixo.


  newsControler
  br.com.controler.NewsControler

  session
 
 
  news
  /news.jsp
  
   salvar
   /sucesso.jsp
  
 
 
  buscar
  /buscar.jsp
  
   pesquisar
   /exibipesquisa.jsp
  
 

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

18 comentários em “Busca com Hibernate Annotation + JSF”

    1. olá Valdemar,

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

      abraco.

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

    1. 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.

  2. 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?

  3. Camilo,

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

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

  5. 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,

  6. 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.

  7. 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,

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

  9. 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,

  10. 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?

    1. 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,

  11. 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.

  12. 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

Deixe um comentário

O seu endereço de e-mail não será publicado.