Hibernate Erro Select

Boa tarde, gente estou tentando fazer um select no hibernate com count, o problema é que o hql do hibernate só esta retornando registros quando o sql é esctito como

Query q= session.createQuery(" FROM Aviso_sinistros WHERE CTR_COD_CONTRATO = 52   AND AVS_ENVIO_TRONADOR = 'S'   AND AVS_DATA_ENVIO_TRONADOR "
		     		+ " BETWEEN :start and :end "
		     		+ " AND COM_TIPO_PESSOA = 'T'  group by CTR_COD_CONTRATO, AVS_DATA_ENVIO_TRONADOR, AVS_ENVIO_TRONADOR");

quando escrevo com

Query q= session.createQuery("select CTR_COD_CONTRATO, AVS_DATA_ENVIO_TRONADOR, AVS_ENVIO_TRONADOR FROM Aviso_sinistros WHERE CTR_COD_CONTRATO = 52   AND AVS_ENVIO_TRONADOR = 'S'   AND AVS_DATA_ENVIO_TRONADOR "
		     		+ " BETWEEN :start and :end "
		     		+ " AND COM_TIPO_PESSOA = 'T'  group by CTR_COD_CONTRATO, AVS_DATA_ENVIO_TRONADOR, AVS_ENVIO_TRONADOR");

por algum motivo quando tento rodar o select inteiro ele dá o seguinte erro:

Se alguem puder ajudar fico muito agradecido. segue abaixo as classes e print do erro:

package br.com.connection;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.List;

import javax.persistence.TemporalType;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.query.Query;

import br.com.model.tabela.Aviso_sinistros;



public class TesteConfronto {
	public static void main(String[] args){
		
		
		  Configuration configuration = new Configuration();
		     configuration.configure();
		     
		     SessionFactory factory = configuration.buildSessionFactory();
		     Session session = factory.openSession();
		/*
		     Query q= session.createQuery("from A2000030 where num_poliza in('570012032931')");
		    */
		     try{
		    	 
		     Query q= session.createQuery("select CTR_COD_CONTRATO, AVS_DATA_ENVIO_TRONADOR, AVS_ENVIO_TRONADOR FROM Aviso_sinistros WHERE CTR_COD_CONTRATO = 52   AND AVS_ENVIO_TRONADOR = 'S'   AND AVS_DATA_ENVIO_TRONADOR "
		     		+ " BETWEEN :start and :end "
		     		+ " AND COM_TIPO_PESSOA = 'T'  group by CTR_COD_CONTRATO, AVS_DATA_ENVIO_TRONADOR, AVS_ENVIO_TRONADOR");
		    
		     Calendar c = Calendar.getInstance();
				c.set(2017, Calendar.MARCH, 8);
				Date data = c.getTime();
				
	
		     q.setDate("start", data);
		     q.setDate("end", data);
		
				
		     	List<Aviso_sinistros> avsin = q.getResultList();
		     
		     		for(Aviso_sinistros av:avsin){
		     			Calendar datasin = av.getAVS_DATA_ENVIO_TRONADOR();
		     			SimpleDateFormat formatdatasin = new SimpleDateFormat("yyyy/MM/dd");
		     			String formatted = formatdatasin.format(datasin.getTime());
		     			
		     			
		     			System.out.println(av.getCTR_COD_CONTRATO()+";"+formatted+";"+av.getAVS_ENVIO_TRONADOR());
		     		}
		     
		     }finally{
		    	 session.close();
		    	 factory.close();
		     }
		     
		
		
		
		
		
	
	}
}

</code>
<code>
package br.com.model.tabela;

import java.util.Calendar;
import java.util.HashSet;
import java.util.Set;

import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;

import org.hibernate.annotations.Formula;


@Entity
@Table(name="AVSINI.AVISO_SINISTROS")
public class Aviso_sinistros {
	
	@Id
	private Long CTR_COD_CONTRATO;
	private Calendar AVS_DATA_ENVIO_TRONADOR;
	private String AVS_ENVIO_TRONADOR;
	

	
	public Long getCTR_COD_CONTRATO() {
		return CTR_COD_CONTRATO;
	}
	public void setCTR_COD_CONTRATO(Long cTR_COD_CONTRATO) {
		CTR_COD_CONTRATO = cTR_COD_CONTRATO;
	}
	public Calendar getAVS_DATA_ENVIO_TRONADOR() {
		return AVS_DATA_ENVIO_TRONADOR;
	}
	public void setAVS_DATA_ENVIO_TRONADOR(Calendar aVS_DATA_ENVIO_TRONADOR) {
		AVS_DATA_ENVIO_TRONADOR = aVS_DATA_ENVIO_TRONADOR;
	}

	public String getAVS_ENVIO_TRONADOR() {
		return AVS_ENVIO_TRONADOR;
	}
	public void setAVS_ENVIO_TRONADOR(String aVS_ENVIO_TRONADOR) {
		AVS_ENVIO_TRONADOR = aVS_ENVIO_TRONADOR;
	}
	
	
	
	
	
}

Quando você especifica os campos que quer de retorno e chama getResultList(), a query te retorna uma lista com arrays de Object, em outras palavras, Object[]. Cada posição do array é a coluna que você pediu na query. Por isso que tá dando erro, você tá tentando fazer um cast (implicitamente) de Object[] para Avisto_sinistros. Se você faz:

Select a, b, c From....

E a, b e c são campos, cada Object[] da lista retornada vai ter na posição 0 o campo a, na posição 1 o campo b, e na posição 2 o campo c.

Pro teu código funcionar com a query que especifica os campos, você pode:

  1. Trocar de List<Avisto_sinistros> avsin = q.getResultList() para List<Object[]> avsin = ..., e então modificar o código posterior para lidar com os dados retornados;

  2. Criar uma classe especial para servir apenas de container de dados, e passar o construtor dessa classe na query. Mais informações aqui: http://stackoverflow.com/questions/12271305/jpql-constructor-expression-org-hibernate-hql-ast-querysyntaxexceptiontable-i

1 curtida

Bom, o primeiro formato é o padrão para o Hibernate Query Language, a famosa HQL. Basicamente, o hibernate vai fazer um select em todas as colunas mapeadas por annotation ou via xml e, para cada resultado, instancia um objeto da classe mapeada, inserindo cada valor ao respectivo atributo via setter (por isso é imprescindível possuir um construtor padrão e os setters e getters quando trabalhando com hibernate).
Como o @lvbarbosa disse, ao fazer o select completo, o hibernate entende que você não quer instanciar objetos mapeados, mas, obter valores aleatórios, por isso retorna uma coleção de vetores que representam, respectivamente, as tuplas existentes na(s) tabela(s) pesquisada.

1 curtida

Então, o select funcionou com object ,minha unica duvida agora é como exibir as informações do select:

List Object[] result= session.createQuery("Select CTR_COD_CONTRATO, AVS_DATA_ENVIO_TRONADOR, AVS_ENVIO_TRONADOR FROM Aviso_sinistros WHERE CTR_COD_CONTRATO = 52 AND AVS_ENVIO_TRONADOR = 'S' AND AVS_DATA_ENVIO_TRONADOR " + " BETWEEN :start and :end " + " AND COM_TIPO_PESSOA = 'T' group by CTR_COD_CONTRATO, AVS_DATA_ENVIO_TRONADOR, AVS_ENVIO_TRONADOR").setDate("start", data).setDate("end", data).getResultList();

tentei assim mas não deu certo

for(Object av:result){
System.out.println(av.toString());
}

Trouxe essa informação:
[Ljava.lang.Object;@2f7a7219

Agora você deverá ler cada valor de cada vetor e colocá-lo onde acha mais adequado.
Pergunta: por que precisa deste select `Select CTR_COD_CONTRATO, AVS_DATA_ENVIO_TRONADOR, AVS_ENVIO_TRONADOR FROM Aviso_sinistros WHERE CTR_COD_CONTRATO = 52 AND AVS_ENVIO_TRONADOR = ‘S’ AND AVS_DATA_ENVIO_TRONADOR "

  • " BETWEEN :start and :end "
  • " AND COM_TIPO_PESSOA = ‘T’ group by CTR_COD_CONTRATO, AVS_DATA_ENVIO_TRONADOR, AVS_ENVIO_TRONADOR`?

para gerar um relatório,e tem mais uns 12 que nem esse