Duvidas em procurar dados em banco de dados mysql utilizando hibernate

Bom dia amigos, não sei se esse seria o melhor local para eu abrir este tópico, pois sou iniciante na linguagem e escolhi este indice por ser o mais parecido com meu problema.

eu estou tentando desenvolver um sistema de cobrança de mensalidades, eu tenho um dao onde tem os metodos procura, salva, remove, lista, tenho uma action para esses metodos, porem nao sei como fazer para quando eu digitar um id em um form jsp, quando eu clicar em buscar, ele retornar os dados contidos no banco de dados mysql referentes a este id, abaixo eu vou colar meus codigos para ver se alguem consegue me ajudar.

agradeço desde já.

ContatoDAO:

public class ContatoDAO {
	private Session session;
	
	public ContatoDAO(Session session){
		this.session = session;
	}
	
	public void salva(Contato c) {
		this.session.save(c);
	}
	
	public void remove(Contato c) {
		this.session.delete(c);
	}
	
	public Contato procura(Long id) {
		return (Contato) this.session.load(Contato.class, id);
	}

                public Contato procuraMatricula(Long matricula) {
		return (Contato) this.session.load(Contato.class, matricula);
	}
	
	public void atualiza(Contato c) {
		this.session.update(c);
	}
	
	public List<Contato> listaTudo() {
		return this.session.createCriteria(Contato.class).list();
	}
	

}

pesquisaMatricula.jsp:

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<c:import url="Cabecalho.jsp" />

<body>
<form action="pesquisaContatos" method="post">
  <p>Matricula:
  <input name="id" type="text"/>
  </p>
<%String id = request.getParameter("id"); %>

<input type="submit" value="Pesquisar">
</form>

<c:import url="Rodape.jsp" />

PesquisaContatosAction:

public class PesquisaContatosAction {
	private Contato contato;
	private Long id;
	
	
	@Action(value="pesquisaContatos", results = {
			@Result(name="ok", location="/listacontatos.jsp"),

	})
	public String execute() {
		Session session = new HibernateUtil().getSession();
		session.beginTransaction();
		ContatoDAO dao = new ContatoDAO(session);
		
		dao.procura(id);
		session.getTransaction().commit();
		session.close();
		return "ok";
	}

	public Contato getContato() {
		return contato;
	}

	public void setMatricula(Long matricula) {
		contato.getMatricula();
	}
}

o erro que aparece quando eu clico em pesquisar é o seguinte:

java.lang.IllegalArgumentException: id to load is required for loading
org.hibernate.event.LoadEvent.(LoadEvent.java:74)
org.hibernate.event.LoadEvent.(LoadEvent.java:56)
org.hibernate.impl.SessionImpl.load(SessionImpl.java:820)
org.hibernate.impl.SessionImpl.load(SessionImpl.java:816)
br.com.mensalidade.hibernate.DAO.ContatoDAO.procura(ContatoDAO.java:25)

agradeço a todos desde já
SDS

Leandro Mouzer

O load só funciona pelo id, para pesquisar usando os outros atributos do objeto vc tem q usar Criteria ou hql.
O load pelo id tambem só funciona se o id existir, se vc tem duvidas se o id existe ou nao use o get ao inves do load, o get retorna null se o objeto nao existir ao inves de lançar exception como faz o load.

leosrbrasil , obrigado pela resposta. voce poderia me dar um exemplo nos arquivos que eu colei? sou iniciante, nao entendi muito bem oque vc quis dizer.

muito obrigado

A exceção que deu pode ser pelo id nao estar inicializado. Nunca usei struts entao nao estou vendo como o id digitado no form está sendo passado para a action. Se vc der um load(null) vai lançar essa exception que vc postou.
Por outro lado, se vc der load(id) e nao existir o id no banco vai dar uma outra exception. Se vc nao tiver certeza que o id existe ou deixar que o usuario digite qualquer coisa, sugiro usar o get(id) que retornara o contato certo ou null se ele nao existir.
Já se vc quiser pesquisar por outros atributos sem ser o id, vai ter que usar :

session.createCriteria(SuaClasse.class).add(Restrictions.eq("nomeDoAtributo", valor)).list() Isso vai te retornar uma List que vc pode fazer um cast para List, se tiver certeza que isso te retornará um único resultado, pode usar o singleResult() no lugar do list(), que vai te retornar um Object que vc faz cast para SuaClasse. Da pra fazer essa mesma busca também por HQL, da uma estudada e ve qual modo vc acha melhor, eu prefiro essa API de Criteria por nao mexer com String de busca mas os dois modos tem suas vantagens.

leosrbrasil, obrigado novamente por tentar me ajudar, eu fiz o seguinte:
public Contato procuraMatricula(Long id) {
return (Contato) session.createCriteria(Contato.class).add(Restrictions.eq(“id”, id)).list();
}

no jsp esta retornando corretamente o id, eu sei qual o id, porem da o mesmo problema, eu coloquei este metodo no ContatoDAO, mas o erro permanece, acho que estou fazendo algo errado, como disse, sou bem iniciante.
agradeço a ajuda

SDS

lembre-se que o list() retorna um objeto do tipo List, não da pra fazer cast pra Contato. Para buscar pelo id é até melhor que vc use o load mesmo, o criteria seria se vc fosse buscar por matricula, nome ou outro atributo.
Como disse anteriormente, esse erro se da pq vc deve estar passando um id nulo para o metodo procura(id) na sua action, inicialize seu id para buscar um valor padrao, tipo:

private Long id = 1

pois provavelmente vc ja inseriu um registro no seu banco, se vc mandar buscar o id 10 e voltar os dados do id 1 é porque o id que vc coloca na tela nao está sendo passado para sua action, e é isso q vc deve corrigir.

leo, eu sei quais sao os ids que tem no banco, porem eu estou fazendo alguns testes aqui, esta passando o id corretamente, vou te mostrar os testes que eu fiz:

a action esta assim:

public String execute() {
		Session session = new HibernateUtil().getSession();
		session.beginTransaction();
		
		this.contato = (Contato) session.get(Contato.class, matricula);

		return "ok";
		
		}

quando eu coloco a matricula, retorna a pagina normalmente, porem vazia, e no console do eclipse eu vejo o seguinte comando:

Hibernate: 
    select
        this_.id as id0_0_,
        this_.bairro as bairro0_0_,
        this_.celular as celular0_0_,
        this_.cep as cep0_0_,
        this_.cidade as cidade0_0_,
        this_.complemento as compleme6_0_0_,
        this_.cpf as cpf0_0_,
        this_.digina as digina0_0_,
        this_.email as email0_0_,
        this_.endereco as endereco0_0_,
        this_.estado as estado0_0_,
        this_.matricula as matricula0_0_,
        this_.nendereco as nendereco0_0_,
        this_.nome as nome0_0_,
        this_.orgaoexp as orgaoexp0_0_,
        this_.rg as rg0_0_,
        this_.sobrenome as sobrenome0_0_,
        this_.telefone as telefone0_0_,
        this_.titulo as titulo0_0_ 
    from
        Contato this_
Hibernate: 
    select
        contato0_.id as id0_0_,
        contato0_.bairro as bairro0_0_,
        contato0_.celular as celular0_0_,
        contato0_.cep as cep0_0_,
        contato0_.cidade as cidade0_0_,
        contato0_.complemento as compleme6_0_0_,
        contato0_.cpf as cpf0_0_,
        contato0_.digina as digina0_0_,
        contato0_.email as email0_0_,
        contato0_.endereco as endereco0_0_,
        contato0_.estado as estado0_0_,
        contato0_.matricula as matricula0_0_,
        contato0_.nendereco as nendereco0_0_,
        contato0_.nome as nome0_0_,
        contato0_.orgaoexp as orgaoexp0_0_,
        contato0_.rg as rg0_0_,
        contato0_.sobrenome as sobrenome0_0_,
        contato0_.telefone as telefone0_0_,
        contato0_.titulo as titulo0_0_ 
    from
        Contato contato0_ 
    where
        contato0_.id=?

estou chegando a conclusao que: só da pra procurar pelo id? nao posso procurar pela matricula? porque o importante pra mim e a matricula e nao o id, pois na classe eu coloquei o id para gerar automaticamente, mas o cliente nao vai saber qual o id e vai querer pesquisar pela matricula, vou colar a classe Contato.class para vc ver, eu queria digitar no jsp a matricula em um form, esse form iria acionar a action pesquisaContatos que tera o dao etc que ira retornar para uma outra pagina jsp os dados do contato, segue a classe:

[code]
@Entity
public class Contato {
@Id
@GeneratedValue
private Long id;
private Long matricula;
private String nome;
private String sobrenome;
private String rg;
private String cpf;
private String titulo;
private String orgaoexp;
private String telefone;
private String celular;
private String email;
private String endereco;
private String nendereco;
private String bairro;
private String cidade;
private String estado;
private String cep;
private String complemento;

[/code]

o get e o load só funcionam com o id msm, agora o Criteria e o HQL funcionam com qualquer atributo, tenta buscar assim:

List<Contato> lista = (List<Contato>) session.createCriteria(Contato.class).add(Restrictions.eq("matricula",1234567)).list();

Para varrer a lista é só fazer:

for(int i=0;i<lista.size();i++){ contato = lista.get(i); } não é o método mais eficiente mas é bem simples de entender.
Se quiser por nome faz:

List<Contato> lista = (List<Contato>) session.createCriteria(Contato.class).add(Restrictions.like("nome","João")).list();

Na API Criteria tem diversas classes para refinar sua busca, da pra fazer qualquer tipo de filtro…

Po, não consegui não, sou bem iniciante, mas obrigado ai pela ajuda…