[RESOLVIDO]Hibernate - Problema para agrupar e contar registros em uma busca

13 respostas
R

Boa tarde,

Tenho uma tabela de levantamentos com uma coluna chamada ujaResp.
Eu preciso saber quantos registros tem para cada UjaResp.

Ai fiz uma consulta assim:

public List<Levantamentos> listaLevantamentos() {
Criteria criterio = getSession().createCriteria(Levantamentos.class);
ProjectionList list = Projections.projectionList();
		list.add(Projections.groupProperty("ujaResp"), "nomeDaUja");
		list.add(Projections.count("ujaResp"), "quantidadePendencias");
		criterio.setProjection(list);
return criterio.list();
}

Obviamente isso deu problema, vinha um arrayList que na posição 1 tinha o nome de cada UjaResp e na posição 2 a quantidade...
ai lendo a respeito, eu fiz a seguinte classe:

public class ContaPendenciasPorUja {
	
	private String nomeDaUja;
	private Integer quantidadePendencias;
	
	
	public ContaPendenciasPorUja(String nomeDaUja, Integer quantidadePendencias) {
		this.nomeDaUja = nomeDaUja;
		this.quantidadePendencias = quantidadePendencias;
	}
	
	
	public String getNomeDaUja() {
		return nomeDaUja;
	}
	public void setNomeDaUja(String nomeDaUja) {
		this.nomeDaUja = nomeDaUja;
	}
	public Integer getQuantidadePendencias() {
		return quantidadePendencias;
	}
	public void setQuantidadePendencias(Integer quantidadePendencias) {
		this.quantidadePendencias = quantidadePendencias;
	}
e a consulta ficou assim:
ProjectionList list = Projections.projectionList();
		list.add(Projections.groupProperty("ujaResp"), "nomeDaUja");
		list.add(Projections.count("ujaResp"), "quantidadePendencias");
		criterio.setProjection(list);
		criterio.setResultTransformer(Transformers.aliasToBean(ContaPendenciasPorUja.class));

Agora a parte que me perdi: Eu não estou sabendo como chamar essa consulta...

pq se eu uso por exemplo:
Object obj = levantamentosDao.contaPendenciasPorUja();

com a consulta:

public Object contaPendenciasPorUja() {
		Criteria criterio = getSession().createCriteria(Levantamentos.class);
		ProjectionList list = Projections.projectionList();
		list.add(Projections.groupProperty("ujaResp"), "nomeDaUja");
		list.add(Projections.count("ujaResp"), "quantidadePendencias");
		criterio.setProjection(list);
		criterio.setResultTransformer(Transformers.aliasToBean(ContaPendenciasPorUja.class));
		return(ContaPendenciasPorUja) criterio.uniqueResult();
	}

da erro.

13 Respostas

E

que erro dá? provavelmente classCastException né?

Quando é assim eu costumo retornar o list mesmo, ele retorna um List de Object[]. Para você não dá para instanciar a classe e setar o valor depois de retornar o List?

R

não…

org.hibernate.HibernateException: Could not instantiate resultclass: br.com.bb.gefin.pdj.controle2.ContaPendenciasPorUja javax.el.ELException: /listaLevantamentos.xhtml @13,156 tabChangeListener="#{levantamentosBean.mudarAba}": org.hibernate.HibernateException: Could not instantiate resultclass: br.com.bb.gefin.pdj.controle2.ContaPendenciasPorUja

E

olhei melhor, não está faltando um construtor sem parâmetros?

R

Bem, alterei a classe e tirei os parametros,

public class ContaPendenciasPorUja {
	
	private String nomeDaUja;
	private Long quantidadePendencias;
	
	
	public ContaPendenciasPorUja() {
		this.nomeDaUja = nomeDaUja;
		this.quantidadePendencias = quantidadePendencias;
	}
	
	
	public String getNomeDaUja() {
		return nomeDaUja;
	}
	public void setNomeDaUja(String nomeDaUja) {
		this.nomeDaUja = nomeDaUja;
	}


	public Long getQuantidadePendencias() {
		return quantidadePendencias;
	}


	public void setQuantidadePendencias(Long quantidadePendencias) {
		this.quantidadePendencias = quantidadePendencias;
	}
		
	
	
}

é isso?

F

Cara ou você remove este construtor ai, ou você usa o o AliasToBeanConstructorResultTransformer

criterio.setResultTransformer(new AliasToBeanConstructorResultTransformer(ContaPendenciasPorUja.class.getConstructors()[0]));

E mantém a classe desta forma, caso você utilize os métodos set remova o final e adicione o método:

public class ContaPendenciasPorUja {
	
	private final String nomeDaUja;
	private final Integer quantidadePendencias;
	
	public ContaPendenciasPorUja(String nomeDaUja, Integer quantidadePendencias) {
		this.nomeDaUja = nomeDaUja;
		this.quantidadePendencias = quantidadePendencias;
	}
	
	public String getNomeDaUja() {
		return nomeDaUja;
	}

	public Integer getQuantidadePendencias() {
		return quantidadePendencias;
	}
}
R

Desculpa, mas estou um pouco muito perdido nisso...

recapitulando:

a classe:
public class ContaPendenciasPorUja {  
          
        private final String nomeDaUja;  
        private final Integer quantidadePendencias;  
          
        public ContaPendenciasPorUja(String nomeDaUja, Integer quantidadePendencias) {  
            this.nomeDaUja = nomeDaUja;  
            this.quantidadePendencias = quantidadePendencias;  
        }  
          
        public String getNomeDaUja() {  
            return nomeDaUja;  
        }  
      
        public Integer getQuantidadePendencias() {  
            return quantidadePendencias;  
        }  
    }
método de busca:
public List<Levantamentos> contaPendenciasPorUja2() {
		Criteria criterio = getSession().createCriteria(Levantamentos.class);
		ProjectionList list = Projections.projectionList();
		list.add(Projections.groupProperty("ujaResp"), "nomeDaUja");
		list.add(Projections.count("ujaResp"), "quantidadePendencias");
		criterio.setProjection(list);
		criterio.setResultTransformer(new AliasToBeanConstructorResultTransformer(ContaPendenciasPorUja.class.getConstructors()[0]));
		return criterio.list();
	}
chamada p/ método:
Object obj = levantamentosDao.contaPendenciasPorUja2();
dúvidas / problemas: no começo da busca, eu coloco:
public List<Levantamentos>
mesmo? e o retorno é
return criterio.list();
mesmo? a chamada da busca, pode ser:
Object obj = levantamentosDao.contaPendenciasPorUja2();
mesmo? de todo jeito, com esse jeito de :
criterio.setResultTransformer(new AliasToBeanConstructorResultTransformer(ContaPendenciasPorUja.class.getConstructors()[0]));
ta dando erro de
could not instantiate class [br.com.bb.gefin.pdj.controle2.ContaPendenciasPorUja] from tuple
F

coloca a stacktrace completa do erro, principalmente o “caused by” que ai fica mais facil de descobrir

R

javax.faces.FacesException: /listaLevantamentos.xhtml @13,156 tabChangeListener="#{levantamentosBean.mudarAba}": org.hibernate.QueryException: could not instantiate class [br.com.bb.gefin.pdj.controle2.ContaPendenciasPorUja] from tuple at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:89) at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101) at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118) at javax.faces.webapp.FacesServlet.service(FacesServlet.java:312) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) at org.primefaces.webapp.filter.FileUploadFilter.doFilter(FileUploadFilter.java:79) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) at br.com.bb.gefin.filtro.HibernateSessionRequestFilter.doFilter(HibernateSessionRequestFilter.java:53) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98) at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:928) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407) at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:987) at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:539) at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:300) at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) at java.lang.Thread.run(Unknown Source) Caused by: javax.el.ELException: /listaLevantamentos.xhtml @13,156 tabChangeListener="#{levantamentosBean.mudarAba}": org.hibernate.QueryException: could not instantiate class [br.com.bb.gefin.pdj.controle2.ContaPendenciasPorUja] from tuple at com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:111) at org.primefaces.component.tabview.TabView.broadcast(TabView.java:222) at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:787) at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1252) at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:81) ... 25 more Caused by: org.hibernate.QueryException: could not instantiate class [br.com.bb.gefin.pdj.controle2.ContaPendenciasPorUja] from tuple at org.hibernate.transform.AliasToBeanConstructorResultTransformer.transformTuple(AliasToBeanConstructorResultTransformer.java:58) at org.hibernate.loader.criteria.CriteriaLoader.getResultColumnOrRow(CriteriaLoader.java:158) at org.hibernate.loader.Loader.getRowFromResultSet(Loader.java:639) at org.hibernate.loader.Loader.doQuery(Loader.java:829) at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:274) at org.hibernate.loader.Loader.doList(Loader.java:2533) at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2276) at org.hibernate.loader.Loader.list(Loader.java:2271) at org.hibernate.loader.criteria.CriteriaLoader.list(CriteriaLoader.java:119) at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1716) at org.hibernate.impl.CriteriaImpl.list(CriteriaImpl.java:347) at br.com.bb.gefin.pdj.dao.LevantamentosDAO.contaPendenciasPorUja2(LevantamentosDAO.java:153) at br.com.bb.gefin.pdj.controle.LevantamentosBean.buscaLevantamentosMonitoramento(LevantamentosBean.java:882) at br.com.bb.gefin.pdj.controle.LevantamentosBean.mudarAba(LevantamentosBean.java:872) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source) at org.apache.el.parser.AstValue.invoke(AstValue.java:262) at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:278) at com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:105) ... 29 more Caused by: java.lang.IllegalArgumentException: argument type mismatch at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source) at java.lang.reflect.Constructor.newInstance(Unknown Source) at org.hibernate.transform.AliasToBeanConstructorResultTransformer.transformTuple(AliasToBeanConstructorResultTransformer.java:55) ... 49 more

E
Caused by: java.lang.IllegalArgumentException: argument type mismatch

Os tipos dos parâmetros não está dando certo.

R

seria algum argumento errado na classe ContaPendenciasPorUja??

Eu mudei ‘quantidadePendencias’ para Integer e não deu certo também…

F

rmaragno:
seria algum argumento errado na classe ContaPendenciasPorUja??

Eu mudei ‘quantidadePendencias’ para Integer e não deu certo também…


Faz o seguinte, coloca o tipo dos parametros do construtor como Object e faz um debug para descobrir qual é o tipo que o hibernate está trazendo.

R

perfeito fbl.lucas!!!

muito obrigado

R

uma dúvida,

Por que tem gente que coloca aquele:

code;[/code] ?

no meu caso ficaria:

Criteria criterio = getSession().createCriteria(Levantamentos.class) .setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);

Existe alguma vantagem / desvantagem e/ou diferença??!

Criado 28 de dezembro de 2011
Ultima resposta 3 de jan. de 2012
Respostas 13
Participantes 3