Critéria retorna um erro, se existir omonomia!

6 respostas
juniorsatanas

Pessoal esse códgio ta retornando um erro quando ele encontra nomes iguais, alguém poderia dizer como resolver isso ?

jr

ClientefDAO.java

public Clientef pesquisaClientefsByNome(String nome) {
		logger.info("pesquisasClientefByNome : " + nome);
		Criteria c = session.createCriteria(Clientef.class);
		c.add(Restrictions.ilike("nome", "%" + nome + "%"));
                c.addOrder(Order.desc("nome"));
		return (Clientef)c.uniqueResult();
	}


ClientefFacadeImpl.java

public List<Clientef> pesquisaClientefsByNome(String nome) {
		sf = new AnnotationConfiguration().configure().buildSessionFactory();
		session = sf.openSession();
		tx = session.beginTransaction();
		clientefDAO = new ClientefDAO(session, Clientef.class);

		List<Clientef> lista = this.clientefDAO.pesquisaClientefs(nome); //no plurar por causa da tabela
		tx.commit();
		session.close();

		return lista;
	}
javax.faces.FacesException: Error calling action method of component with id j_id_jsp_1107764850_1:j_id_jsp_1107764850_5
	at org.apache.myfaces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:72)
	at javax.faces.component.UICommand.broadcast(UICommand.java:143)
	at org.ajax4jsf.component.AjaxActionComponent.broadcast(AjaxActionComponent.java:55)
	at org.ajax4jsf.component.AjaxViewRoot.processEvents(AjaxViewRoot.java:321)
	at org.ajax4jsf.component.AjaxViewRoot.broadcastEvents(AjaxViewRoot.java:296)
	at org.ajax4jsf.component.AjaxViewRoot.processPhase(AjaxViewRoot.java:253)
	at org.ajax4jsf.component.AjaxViewRoot.processApplication(AjaxViewRoot.java:466)
	at org.apache.myfaces.lifecycle.InvokeApplicationExecutor.execute(InvokeApplicationExecutor.java:32)
	at org.apache.myfaces.lifecycle.LifecycleImpl.executePhase(LifecycleImpl.java:103)
	at org.apache.myfaces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:76)
	at javax.faces.webapp.FacesServlet.service(FacesServlet.java:151)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.ajax4jsf.webapp.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:178)
	at org.ajax4jsf.webapp.BaseFilter.handleRequest(BaseFilter.java:290)
	at org.ajax4jsf.webapp.BaseFilter.processUploadsAndHandleRequest(BaseFilter.java:368)
	at org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:495)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at br.gov.nutec.filtro.AuthFilter.doFilter(AuthFilter.java:26)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:390)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:849)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:454)
	at java.lang.Thread.run(Thread.java:619)
Caused by: javax.faces.el.EvaluationException: org.apache.jasper.el.JspELException: /pages/cadastroClientef/cadastraClientef.jsp(26,16) '#{clientefMB.pesquisaByNome}' org.hibernate.NonUniqueResultException: query did not return a unique result: 3
	at javax.faces.component._MethodExpressionToMethodBinding.invoke(_MethodExpressionToMethodBinding.java:82)
	at org.apache.myfaces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:57)
	... 34 more
Caused by: org.apache.jasper.el.JspELException: /pages/cadastroClientef/cadastraClientef.jsp(26,16) '#{clientefMB.pesquisaByNome}' org.hibernate.NonUniqueResultException: query did not return a unique result: 3
	at org.apache.jasper.el.JspMethodExpression.invoke(JspMethodExpression.java:77)
	at javax.faces.component._MethodExpressionToMethodBinding.invoke(_MethodExpressionToMethodBinding.java:78)
	... 35 more
Caused by: org.hibernate.NonUniqueResultException: query did not return a unique result: 3
	at org.hibernate.impl.AbstractQueryImpl.uniqueElement(AbstractQueryImpl.java:844)
	at org.hibernate.impl.CriteriaImpl.uniqueResult(CriteriaImpl.java:328)
	at br.gov.nutec.dao.ClientefDAO.pesquisaClientefsByNome(ClientefDAO.java:32)
	at br.gov.nutec.facade.ClientefFacadeImpl.procuraByNome(ClientefFacadeImpl.java:116)
	at br.gov.nutec.mb.ClientefMB.pesquisaByNome(ClientefMB.java:118)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at org.apache.el.parser.AstValue.invoke(AstValue.java:172)
	at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:276)
	at org.apache.jasper.el.JspMethodExpression.invoke(JspMethodExpression.java:68)

6 Respostas

Abdon

Ele da esse erro prq vc esta dando um

(Clientef)c.uniqueResult();

para uma query que retorna uma lista vc tem que fazer um.

c.toList();

Se vc tem nomes iguais no seu banco e vc pesquisa por ele, com certeza vai retornar mais de um resultado e nem faz sentido vc forçar a barra para que isso não aconteça.

Mas se mesmo assim vc quizer pega o primeiro retorno da lista hahahahahahah so não conta para ninguem que fui eu quem falei isso!!

rsrsrs

juniorsatanas

ok não falo não !
ficou assim:

package br.gov.nutec.facade;
import java.util.List;
import br.gov.nutec.modelo.Clientef;

public interface ClientefFacade extends BaseFacade<Clientef>{
	public void salva(Clientef p);

	public void remove(Clientef p);

	public Clientef procura(Long id);

	public void atualiza(Clientef p);

        public List<Clientef> lista(String nome);

        public List<Clientef> pesquisaClientefsByNome(String nome);

	//public boolean autentica(String email, String senha, String status);
        
}
package br.gov.nutec.mb;

import java.io.IOException;
import java.io.Serializable;
import java.util.List;

import javax.faces.context.FacesContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import br.gov.nutec.facade.ClientefFacade;
import br.gov.nutec.facade.ClientefFacadeImpl;
import br.gov.nutec.modelo.Clientef;

public class ClientefMB implements Serializable {

	private static long serialVersionUID = -333995781063775201L;

              /**
               * @return the serialVersionUID
               */
              public static long getSerialVersionUID() {
                            return serialVersionUID;
              }

              /**
               * @param aSerialVersionUID the serialVersionUID to set
               */
              public static void setSerialVersionUID(long aSerialVersionUID) {
                            serialVersionUID = aSerialVersionUID;
              }

	private Clientef clientef = new Clientef();   //campos criados
	private Long id;
        

	public ClientefMB(){
		System.out.println(" >>>>>>>>>>>>>>>>>>>> Contrutor do CLIENTEF_MB <<<<<<<<<<<<<<<<<<");

		if(this.clientef == null){
			this.clientef = new Clientef();
		}
	}

public String login() throws Exception{
        boolean logado = true;


        HttpSession session = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(false);
        HttpServletResponse rp = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse();
        HttpServletRequest rq = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest();
        ClientefFacade ClientefService = new ClientefFacadeImpl();

       //logado = ClientefService.autentica(this.getClientef().getEmail(), this.getClientef().getSenha(),this.getClientef().getStatus());

        if(logado){
            session.setAttribute("user", logado);
            rp.sendRedirect(rq.getContextPath() + "/pages/index.jsf");
            return "success";

        }else{

            session.setAttribute("user", null);
            session.removeAttribute("user");
            rp.sendRedirect(rq.getContextPath() + "/pages/login/login.jsf");
            return "failure";
        }


        }


	public String logout() {
		HttpServletRequest rq = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest();
		HttpServletResponse rp = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse();
		FacesContext facesContext = FacesContext.getCurrentInstance();
		HttpSession session = (HttpSession) facesContext.getExternalContext().getSession(false);
		session.invalidate();
		try {
			rp.sendRedirect(rq.getContextPath() + "/pages/login/login.jsf");
		} catch (IOException e) {
			e.printStackTrace();
		}

		return "logoutOk";
	}

	public String save(){
		ClientefFacade clientefService = new ClientefFacadeImpl();
		clientefService.salva(this.getClientef());
	        this.setClientef(new Clientef());
		return "cadastraSucesso";
	}

	public String delete(){
		ClientefFacade clientefService = new ClientefFacadeImpl();
                this.getClientef().setId(getId());
		clientefService.remove(this.getClientef());
	        this.setClientef(new Clientef());
		return "removeSucesso";
	}

	public String merge(){
		ClientefFacade clientefService = new ClientefFacadeImpl();
		clientefService.atualiza(this.getClientef());
	        this.setClientef(new Clientef());
		return "atualizaSucesso";
	}

	public String load(){
		ClientefFacade clientefService = new ClientefFacadeImpl();
	        this.setClientef(clientefService.procura(this.getId()));
		return "pesquisaSucesso";
	}
	public String pesquisaByNome(){
		ClientefFacadeImpl clientefService = new ClientefFacadeImpl();
		this.setClientef(clientefService.procuraByNome(this.getClientef().getNome()));
		return "pesquisaByNomeSucesso";
	}

	public List<Clientef> getClientefs(){
		ClientefFacade clientefService = new ClientefFacadeImpl();
		return clientefService.lista();
	}
	public List<Clientef> getClientefsByNome(){
		ClientefFacade clientefService = new ClientefFacadeImpl();// plura por causa da tabela
		List<Clientef> lista = clientefService.pesquisaClientefsByNome(this.getClientef().getNome());
		return lista;
	}

    public Clientef getClientef() {
        return clientef;
    }

    public void setClientef(Clientef clientef) {
        this.clientef = clientef;
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }




}
public Clientef pesquisaClientefsByNome(String nome) {
		logger.info("pesquisasClientefByNome : " + nome);
		Criteria c = session.createCriteria(Clientef.class);
		c.add(Restrictions.ilike("nome", "%" + nome + "%"));
                c.addOrder(Order.desc("nome"));
                return (Clientef)c.toList();
		//return (Clientef)c.uniqueResult();
	}
init:
undeploy-clean:
deps-clean:
do-clean:
Deleting directory /home/junior/Dionisio/nbbuild
Deleting directory /home/junior/Dionisio/dist
check-clean:
clean:
init:
deps-module-jar:
deps-ear-jar:
deps-jar:
Created dir: /home/junior/Dionisio/nbbuild/web/WEB-INF/classes
Copying 242 files to /home/junior/Dionisio/nbbuild/web
library-inclusion-in-archive:
library-inclusion-in-manifest:
Created dir: /home/junior/Dionisio/nbbuild/empty
Compiling 18 source files to /home/junior/Dionisio/nbbuild/web/WEB-INF/classes
/home/junior/Dionisio/src/br/gov/nutec/dao/ClientefDAO.java:32: cannot find symbol
symbol  : method toList()
location: interface org.hibernate.Criteria
                return (Clientef)c.toList();
1 error
/home/junior/Dionisio/nbproject/build-impl.xml:407: The following error occurred while executing this line:
/home/junior/Dionisio/nbproject/build-impl.xml:230: Compile failed; see the compiler error output for details.
FALHA NA CONSTRUÇÃO (tempo total: 0 segundos)

Obrigado bom dia !

jr

Abdon

hahaha

O metodo não é toList eu falei besteira é apenas list();

c.list()

sorry

So que da forma que vc implementou ainda não vai funcionar, vc tem que pegar um elemento da lista, com o metodo get, mas como eu tentei explicar essa não é a solução ideal.

Se vc apenas arrumar o metodo que eu falei errado sem pegar um elemento da lista vc terá uma ClassCastException.

O ideal seria vc Criar uma lista mostrando os nomes duplicados com o CPF ai o usuario clicaria em cima do correto, indo para a pagina que exibe os dados. Assim vc não ocultaria nenhum resultado.

Na verdade eu falei brincando, não pensei que vc seguiria a solução e pegar o primeiro elemento da lista.

juniorsatanas

Pois é tentei deu certo !

Valeu !

Abdon

Cara não siga a minha solução zuada, eu tinha falado de brincadeira, observe a sua tela, vc deve retornar uma lista para a jsp, interar ela no combo abaixo, ai o usuario clicaria em Selecionar, no que ele deseja cadastrar.

Da forma que vc esta fazendo vc simplemente vai ignorar pessoas com o mesmo nome, o que é uma situação comum.

Se vc deixar assim com certeza quando ele for para teste isso vai voltar. (se é que isso não é seu estudo e não um trabalho profissional, sei lá)

juniorsatanas

mais eu vou fazer por CPF, logo vai pegar !

Criado 29 de janeiro de 2010
Ultima resposta 29 de jan. de 2010
Respostas 6
Participantes 2