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

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:

[code]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;
}[/code]

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.

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?

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

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

Bem, alterei a classe e tirei os parametros,

[code] 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;
}

}[/code]

é isso?

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;
	}
}

Desculpa, mas estou um pouco muito perdido nisso…

recapitulando:

a classe:

[code] 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;  
    }  
}  [/code]

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

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

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

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

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

seria algum argumento errado na classe ContaPendenciasPorUja??

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

[quote=rmaragno]seria algum argumento errado na classe ContaPendenciasPorUja??

Eu mudei ‘quantidadePendencias’ para Integer e não deu certo também…
[/quote]
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.

perfeito fbl.lucas!!!

muito obrigado

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