Criteria hibernate annotations

Olá pessoal estou tendo dificuldades de resolver esse probleminha que vou postar para vcs olharem

Estou tentando fazer dois tipos de consulta que me retornam os dados para dentro de um formulario

1ª consulta

public Object buscar(Class clazz,Integer pk) throws Exception  {             
        Session session = HibernateFactory.getSession();
        Transaction transaction = session.beginTransaction();    
        try {          
          Serializable obj = (Serializable) session.get(clazz, pk );  
          session.flush();  
          transaction.commit();  
          return  obj;  
     } finally {  
          session.close();  
     }
   }

Porém dessa maneira só posso consultar a chave do banco

Mas como eu preciso consultar um String e ele não é chave, estou fazendo assim

public List buscarByCodigo(Class clazz, String codigo) throws Exception{
        Session session = HibernateFactory.getSession();
        Transaction transaction = session.beginTransaction();    
        try{
            List list = session.createCriteria(clazz, codigo).list();            
            session.flush();
            transaction.commit();
            return list;
        }finally{
            session.close();
        }
    }

Só que dessa maneira me retorna em forma de listagem e quando faço o envio para dentro do form da erro

javax.servlet.ServletException: java.lang.NoSuchMethodError: hibernate.PersistenciaDAO.buscarByCodigo(Ljava/lang/Class;Ljava/lang/String;)Ljava/lang/Object;
	org.apache.struts.actions.DispatchAction.dispatchMethod(DispatchAction.java:294)
	org.apache.struts.actions.DispatchAction.execute(DispatchAction.java:187)
	org.apache.struts.actions.LookupDispatchAction.execute(LookupDispatchAction.java:150)
	org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:431)
	org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:236)
	org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196)
	org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:432)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
	org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:390)

root cause

java.lang.NoSuchMethodError: hibernate.PersistenciaDAO.buscarByCodigo(Ljava/lang/Class;Ljava/lang/String;)Ljava/lang/Object;
	conta.action.ContaAction.buscar(ContaAction.java:85)
	sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	java.lang.reflect.Method.invoke(Method.java:597)
	org.apache.struts.actions.DispatchAction.dispatchMethod(DispatchAction.java:270)
	org.apache.struts.actions.DispatchAction.execute(DispatchAction.java:187)
	org.apache.struts.actions.LookupDispatchAction.execute(LookupDispatchAction.java:150)
	org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:431)
	org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:236)
	org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196)
	org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:432)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:710)

Como posso fazer para resolver isso?

eu fiz assim…

[code] public ClienteBean findByCPF(ClienteBean clienteBean) {

	Criteria criteria = HibernateFactory.getInstance().getSession()
			.createCriteria(ClienteBean.class);
	criteria.add(Expression.eq("cpf", clienteBean.getCpf()));
	return (ClienteBean) criteria.uniqueResult();
}[/code]

acho que esse exemplo pode te dar uma ajudada…

Cara obrigado pela ajuda, porém apareceu um erro, mais acho que o caminho é esse

O Metodo ficou assim

public Conta buscarByCodigo(Conta conta) throws Exception{
        Session session = HibernateFactory.getSession();
        Transaction transaction = session.beginTransaction();    
        Criteria criteria = session.createCriteria(Conta.class);
        criteria.add(Expression.eq("codigo", conta.getCodigo()));
        
        return (Conta) criteria.uniqueResult();  
    }

O erro foi esse


avax.servlet.ServletException: java.lang.IllegalArgumentException: No origin bean specified
	org.apache.struts.action.RequestProcessor.processException(RequestProcessor.java:535)
	org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:433)
	org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:236)
	org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196)
	org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:432)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
	org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:390)

root cause

java.lang.IllegalArgumentException: No origin bean specified
	org.apache.commons.beanutils.BeanUtils.copyProperties(BeanUtils.java:224)
	conta.action.ContaAction.buscar(ContaAction.java:86)
	sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	java.lang.reflect.Method.invoke(Method.java:597)
	org.apache.struts.actions.DispatchAction.dispatchMethod(DispatchAction.java:270)
	org.apache.struts.actions.DispatchAction.execute(DispatchAction.java:187)
	org.apache.struts.actions.LookupDispatchAction.execute(LookupDispatchAction.java:150)
	org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:431)
	org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:236)
	org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196)
	org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:432)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:803)

O que pode ser?

esse “codigo” seria o atributo do seu bean?
corretamente?

isso codigo e um atributo

cola o bean ai please…

Bean

@Entity
@Table(name = "conta")
public class Conta implements Serializable {

    private static final long serialVersionUID = 1L;
    
    @Id
    @GeneratedValue(strategy=GenerationType.SEQUENCE)
    @Column(name = "idconta", nullable = false)
    private Integer idconta;
    
    @Column(name = "codigo")
    private String codigo;
            
    @Column(name = "nome", nullable = false)
    private String nome;
    
    @Column(name = "obs")
    private String obs;

              gets ... sets

o pau não é na classe é em outro lugar

Pois é cara não to conseguindo tbm, mais creio que esta tudo certo ne?

a parte do hibernate ta funcionando sim
esse pau ai é com o struts e a jsp…

cola os codigo ai…

JSP

 <html:form action="conta" focus="codigo">            
            <bean:message key="label.codigo"/><html:text property="codigo"/>            
            <bean:message key="label.nome"/><html:text property="nome"/>
            <bean:message key="label.obs"/><html:text property="obs" />            
            <html:submit property="method" ><bean:message key="button.salvar" /></html:submit>
            <html:submit property="method" ><bean:message key="button.deletar" /></html:submit>
            <html:submit property="method" ><bean:message key="button.buscar" /></html:submit>
            <html:submit property="method" ><bean:message key="button.limpar" /></html:submit>
        </html:form>

Action

 HttpSession session = request.getSession();
        
        ContaForm contaForm = (ContaForm) form;
        Conta conta = new Conta();        
        
        PersistenciaDAO persistencia = new PersistenciaDAO();     
        
        conta = (Conta) persistencia.buscarByCodigo(conta); 
        
        BeanUtils.copyProperties(contaForm, conta);

ContaForm contaForm = (ContaForm) form;
Conta conta = new Conta();

mude para

ContaForm contaForm = (ContaForm) form;
Conta conta = contaForm.getConta();

e nada ainda :frowning:

cola tua classe toda…

Cara desde já quero agradecer a sua ajuda :wink: , muito bom quando alguem se compromete em realmente ajudar

Action

public ActionForward buscar(ActionMapping mapping, ActionForm  form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {                                                                         
        
        HttpSession session = request.getSession();
        
        ContaForm contaForm = (ContaForm) form;
        Conta conta = contaForm.getConta();        
        
        PersistenciaDAO persistencia = new PersistenciaDAO();     
        
        conta = (Conta) persistencia.buscarByCodigo(conta); 
        
        BeanUtils.copyProperties(contaForm, conta);
        
        return mapping.findForward(SUCCESS);        
                
    }

cola o xml do hibernate e do struts…

acho que achei teu erro

muda isso

BeanUtils.copyProperties(contaForm, conta);

para

BeanUtils.copyProperties(contaForm.getConta();, conta);

se nao der certo tira ele e vamos ver se roda
o pau ta neesse BeanUtils

tem algum outro atributo setado no teu bean?
ou somente o código?

No meu bean tem mais coisas setadas como nome e obs

Fiz todas as mudanças e inventei mais algumas, hehe, mais sem sucesso

Vou mudar meu sistema e adotar outra extrategia, valeu galera pela ajuda :frowning:

você ja tento usa hql?