Ajuda com consulta [RESOLVIDO]

[code] List solicitantes = (List) sessao.createQuery(

            "select s.idSolicitante as idSolicitante, s.nome as nome, s.sobrenome as sobrenome, s.setor.descricao as setor, count(idSolicitante) as totalChamdas from Solicitante s group by idSolicitante ").list();
    
    trans.commit();[/code]

está consulta esta gerando o seguinte erro

org.hibernate.exception.SQLGrammarException: could not execute query

algúem pode me ajudar

Boa tarde lucasbf1992,

o erro não seria isso

 s.setor.descricao as setor

O banco de dados não aceita este tipo de coisa.
se setor for outra tabela pode fazer assim.

select s.idSolicitante as idSolicitante,
       s.nome as nome,
       s.sobrenome as sobrenome,
       (select descricao from setor b where b.idsetor = s.idsetor) setor,
       count(idSolicitante) as totalChamdas
  from Solicitante s
 group by idSolicitante 

[quote=aszarael]Boa tarde lucasbf1992,

o erro não seria isso

 s.setor.descricao as setor

O banco de dados não aceita este tipo de coisa.
se setor for outra tabela pode fazer assim.

select s.idSolicitante as idSolicitante, s.nome as nome, s.sobrenome as sobrenome, (select descricao from setor b where b.idsetor = s.idsetor) setor, count(idSolicitante) as totalChamdas from Solicitante s group by idSolicitante [/quote]

Boa noite, fiz a correção que me indicou porém está retornando o seguinte erro agora

org.hibernate.hql.ast.QuerySyntaxException: unexpected token: setor near line 1, column 180 [select s.idSolicitante as idSolicitante, s.nome as nome, s.sobrenome as sobrenome, (select descricao from Setor b where b.idsetor = s.idsetor) setor, count(idSolicitante) as totalChamdas from br.com.sistema_servicos.entity.Solicitante s group by idSolicitante]

Agora entendi o seu problema.

Este tipo de consulta no hibernate costuma da rolo.

cria uma view com está consulta e use ela no hibernate.

Faço isso quanto tenho este tipo de consulta.

Se for oracle faça assim

[code]
create or replace view nome da view
as
select s.idSolicitante as idSolicitante,
s.nome as nome,
s.sobrenome as sobrenome,
(select descricao from setor b where b.idsetor = s.idsetor) setor,
count(idSolicitante) as totalChamdas
from Solicitante s ;

[quote=aszarael]Agora entendi o seu problema.

Este tipo de consulta no hibernate costuma da rolo.

cria uma view com está consulta e use ela no hibernate.

Faço isso quanto tenho este tipo de consulta.

Se for oracle faça assim

[code]
create or replace view nome da view
as
select s.idSolicitante as idSolicitante,
s.nome as nome,
s.sobrenome as sobrenome,
(select descricao from setor b where b.idsetor = s.idsetor) setor,
count(idSolicitante) as totalChamdas
from Solicitante s ;[/quote]

Cara estou usando postgres, criei a view tudo certinho esta funcionando perfeitamente no banco. Poderia me da um exemplo como chamo ela usando o hibernate, ela tem que ser mapeada ?

Eu monto as minhas classes desta maneira

Crie um Model da classe

Exemplo

package com.br.model;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name="VW_Parametros")
public class VW_Parametros{
	
	@Id
	@GeneratedValue(strategy = GenerationType.AUTO)
	int COD_PARAMETRO;
	@Column
	String DSC_PATH;
	@Column
	String DSC_PATH_DOWN;
	@Column
	String DSC_PATH_NTC_LOADER;
	@Column
	String DSC_PATH_IMEI_LOADER;
	@Column
	String DSC_PATH_LOTE_PAGTO_LOADER;
	@Column
	String DSC_PATH_PROJETO;
	@Column
	String DSC_PATH_COMUNICADO;
	@Column
	String DSC_PATH_MANUAIS;
	@Column
	String DSC_PATH_CONTA_LOADER;
	@Column
	String DSC_PATH_REPORT;
	
	public int getCOD_PARAMETRO() {
		return COD_PARAMETRO;
	}
	
	public void setCOD_PARAMETRO(int cOD_PARAMETROS) {
		COD_PARAMETRO = cOD_PARAMETROS;
	}
	
	public String getDSC_PATH() {
		return DSC_PATH;
	}
	
	public void setDSC_PATH(String dSC_PATH) {
		DSC_PATH = dSC_PATH;
	}

	public String getDSC_PATH_DOWN() {
		return DSC_PATH_DOWN;
	}

	public void setDSC_PATH_DOWN(String dSC_PATH_DOWN) {
		DSC_PATH_DOWN = dSC_PATH_DOWN;
	}

	public String getDSC_PATH_NTC_LOADER() {
		return DSC_PATH_NTC_LOADER;
	}

	public void setDSC_PATH_NTC_LOADER(String dSC_PATH_NTC_LOADER) {
		DSC_PATH_NTC_LOADER = dSC_PATH_NTC_LOADER;
	}

	public String getDSC_PATH_IMEI_LOADER() {
		return DSC_PATH_IMEI_LOADER;
	}

	public void setDSC_PATH_IMEI_LOADER(String dSC_PATH_IMEI_LOADER) {
		DSC_PATH_IMEI_LOADER = dSC_PATH_IMEI_LOADER;
	}

	public String getDSC_PATH_LOTE_PAGTO_LOADER() {
		return DSC_PATH_LOTE_PAGTO_LOADER;
	}

	public void setDSC_PATH_LOTE_PAGTO_LOADER(String dSC_PATH_LOTE_PAGTO_LOADER) {
		DSC_PATH_LOTE_PAGTO_LOADER = dSC_PATH_LOTE_PAGTO_LOADER;
	}

	public String getDSC_PATH_PROJETO() {
		return DSC_PATH_PROJETO;
	}

	public void setDSC_PATH_PROJETO(String dSC_PATH_PROJETO) {
		DSC_PATH_PROJETO = dSC_PATH_PROJETO;
	}

	public String getDSC_PATH_COMUNICADO() {
		return DSC_PATH_COMUNICADO;
	}

	public void setDSC_PATH_COMUNICADO(String dSC_PATH_COMUNICADO) {
		DSC_PATH_COMUNICADO = dSC_PATH_COMUNICADO;
	}

	public String getDSC_PATH_MANUAIS() {
		return DSC_PATH_MANUAIS;
	}

	public void setDSC_PATH_MANUAIS(String dSC_PATH_MANUAIS) {
		DSC_PATH_MANUAIS = dSC_PATH_MANUAIS;
	}

	public String getDSC_PATH_CONTA_LOADER() {
		return DSC_PATH_CONTA_LOADER;
	}

	public void setDSC_PATH_CONTA_LOADER(String dSC_PATH_CONTA_LOADER) {
		DSC_PATH_CONTA_LOADER = dSC_PATH_CONTA_LOADER;
	}

	public String getDSC_PATH_REPORT() {
		return DSC_PATH_REPORT;
	}

	public void setDSC_PATH_REPORT(String dSC_PATH_REPORT) {
		DSC_PATH_REPORT = dSC_PATH_REPORT;
	}		
}

Depois utilizo na classe de Dao

package com.br.dao;

import java.util.List;
import java.util.logging.Logger;

import javax.persistence.EntityManager;
import javax.persistence.Query;

import com.br.model.VW_Parametros;

public class VW_ParametrosDao {
	
	private Logger        logger = Logger.getLogger("br.com.log"); 
	private StringBuilder vSQL   = new StringBuilder();

	private EntityManager getEntityManager(){
		
		ManagerEntityManager manager = new ManagerEntityManager();
		return manager.getEntityManager();
	}
	

	/* Metodo de consulta no banco de dados */
	private List<Parametros> consultar(List<String> pColunas, List<String> pValores){
		
		EntityManager entityManager = getEntityManager();
		vSQL.append("from VW_Parametros as vw_parametros");
		
		if (pColunas != null){
			vSQL.append(" WHERE ");
			
			for (int i = 0; i < pColunas.size(); i++){
				if (i==0){
					vSQL.append(" " + pColunas.get(i).toString() + " = '" + pValores.get(i).toString() + "'");
				}else{
					vSQL.append(" AND " + pColunas.get(i).toString() + " = '" + pValores.get(i).toString() + "'");
				}
			}
		}
		
		vSQL.append(" ORDER BY COD_PARAMETRO");
		logger.info("Consulta executada : " + vSQL);
		Query vQuery = entityManager.createQuery(vSQL.toString());		
		@SuppressWarnings("unchecked")
		List<Parametros> listaParametros = vQuery.getResultList();
		entityManager.close();
		return listaParametros;		
	}
	
	public List<Parametros> select(List<String> pColunas, List<String> pValores){
		return consultar(pColunas,pValores);
	}
	
}

Ou seja, a view e usada como uma tabela normal na consulta.

Mapeie a view no persistence.xml

<class>com.br.model.VW_Parametros</class>

Espero ter ajudado, qualquer coisa da um toque.

Cara consegui aqui, muito obrigado mesmo pela a dica, estou começando agora a trabalhar com hibernate e tava tendo um trabalhão com esse tipo de consulta. Usar as views e mapeá-las simplifica demais. Vlw abraço