Hibernate + createQuery

4 respostas
monike

Boa Tarde Galera!
Gostaria de saber a maneira correta de executar essa query,pois pelo erro que recebo já sei que está incorreta.
obrigada! :)

org.hibernate.hql.ast.QuerySyntaxException: unexpected token: ON near line 1, column 240

@SuppressWarnings("unchecked")
		public Collection<Servidor> obterPorSetor(Servidor servidor,String sigla) throws AplicacaoException{
		Session session = SessionFactoryUtil.getInstance().getCurrentSession();
		Collection<Servidor> lista = null;
		
		try {
			tx = session.beginTransaction();
			Query query = session.createQuery(" SELECT DISTINCT Servidor.CD_SERVIDOR AS codigo ,UnidadeOrganizacional.sg_unidade_organiz AS sigla ,"+
					"Servidor.NM_SERVIDOR AS nome , Servidor.CD_MATRIC_SIAPE AS MATRICULA FROM crp_servidor AS  Servidor " +
					"INNER JOIN crp_cargo_servidor AS Cargo ON Cargo.cd_servidor = Servidor.cd_servidor  " +
					"INNER JOIN crp_ocorrencia AS Ocorrencia ON Servidor.cd_servidor = Ocorrencia.cd_servidor " +
					"INNER JOIN crp_unidade_organi AS UnidadeOrganizacional ON Servidor.cd_unidade_organiz = UnidadeOrganizacional.cd_unidade_organiz " +
					"WHERE Servidor.cd_situacao_servidor IN ( '01', '04') " +
					"AND UnidadeOrganizacional.sg_unidade_organiz=? " +
					"AND Ocorrencia.cd_tipo_ocorrencia " +
					"AND Cargo.dt_saida_cargo IS NULL  ");
			query.setString(0, sigla);
			lista = (Collection<Servidor>) query.list();
			tx.commit();

		} catch (RuntimeException e) {
			throw new AplicacaoException(e.getMessage(), e);
		}

		return lista;
	}

4 Respostas

hvivox

vc não precisa dar espaço entre a virgula e o atributo

forma errada:
 SELECT DISTINCT Servidor.CD_SERVIDOR AS codigo ,UnidadeOrganizacional.sg_unidade_organiz AS sigla 

forma correta:
 SELECT DISTINCT Servidor.CD_SERVIDOR AS codigo, UnidadeOrganizacional.sg_unidade_organiz AS sigla

observe a posição da virgula. Preciso que vc poste sua classe de conexão com o banco "SessionFactoryUtil" preciso comparar algumas coisas. OK!

bjs.

monike

Oie, obrigada pela atenção!
Ajeitei o espaço entre os atributos,mas o erro continua.
Minha classe:

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.AnnotationConfiguration;

public class SessionFactoryUtil {

	/** The single instance of hibernate SessionFactory */
	private static org.hibernate.SessionFactory sessionFactory;

	/**
	 * disable contructor to guaranty a single instance
	 */
	private SessionFactoryUtil() {
	}

	static {
		// Annotation and XML
		sessionFactory = new AnnotationConfiguration().configure()
				.buildSessionFactory();
		// XML only
		// sessionFactory = new
		// Configuration().configure().buildSessionFactory();
	}

	public static SessionFactory getInstance() {
		return sessionFactory;
	}

	/**
	 * Opens a session and will not bind it to a session context
	 * 
	 * @return the session
	 */
	public Session openSession() {
		return sessionFactory.openSession();
	}

	/**
	 * Returns a session from the session context. If there is no session in the
	 * context it opens a session, stores it in the context and returns it. This
	 * factory is intended to be used with a hibernate.cfg.xml including the
	 * following property <property
	 * name="current_session_context_class">thread</property> This would return
	 * the current open session or if this does not exist, will create a new
	 * session
	 * 
	 * @return the session
	 */
	public Session getCurrentSession() {
		return sessionFactory.getCurrentSession();
	}

	/**
	 * closes the session factory
	 */
	public static void close() {
		if (sessionFactory != null && !sessionFactory.isClosed() )
			sessionFactory.close();
		sessionFactory = null;

	}
}
hvivox

Esqueci de comentar: quando vc utiliza hibernate especificamente com reateQuery na verdade vc de deixa de trabalhar com sql e passa a trabalhar com hql em que a sitaxe de é diferente veja o exemplo de minha consulta

public List procurarPorData(String dataInicial, String dataFinal, String uniOperacional) {		
		session = ConnectDB.getInstance();
		Transaction tx = session.beginTransaction();
		
		/*Consulta para buscar os dados. (:) isto &#65533; para que o HQL identifique qual &#65533; o parametro de entrada*/
		/*Esta clausula utiliza os objetos do V.O por isso tem que ser case sencitive para n&#65533;o ocorrer erro*/
		Query select = session.
		createQuery("Select regVis.Reg_codigo, vis.Vis_nome, setor.Set_nome, uniOp.Uni_nome, " +
		
						"regVis.Reg_status, regVis.Reg_horaEntrada, " +
		
						"regVis.Reg_horaSaida, regVis.Reg_dataVisita, regVis.Reg_usuarioLogado " +
		
				
					"FROM RegistrarVisita regVis inner join regVis.setor setor inner join setor.uniOp uniOp inner join " +
					
						"regVis.visitante vis inner join regVis.colaborador colab " +
		");		
		
		
		//atribui um valor de entrada no parametro neste caso o valor da entrada s&#65533;o mostrados abaixo.
		select.setString("uniOperacional", uniOperacional)
		.setString("dataInicial", dataInicial)
		.setString("dataFinal", dataFinal);
		
		List list = select.list();
				
		tx.commit();
		session.close();
		
		return list;		
	}//fim

Qual o banco que vc está utilizando? se vc quiser utilizar a linguagem nativa do banco vai ter que fazer assim:

Query select = session.createSQLQuery(

bjs

muito obrigado pela classe enviada estou bolando a classe de conexão perfeita para utilização

monike

Exatamente,já tentei usar sql nativa.Mas tb nao funcinou.
Na verdade essa query aqui vai beleza.Mas o problema é que entrou mais duas condiçoes de mais duas tabelas diferentes. A tabela de cargo e unidade,essas duas tabelas já estao mapeadas no .xml e seus respectivos modelos com os relacionamentos.
Ex: AND OCORRENCIA.cd_tipo_ocorrencia
AND CARGO.dt_saida_cargo IS NULL

public Collection<Servidor> obterPorSetor(Servidor servidor,String sigla) throws AplicacaoException{
		Session session = SessionFactoryUtil.getInstance().getCurrentSession();
		Collection<Servidor> lista = null;
		
		try {
			tx = session.beginTransaction();
	[b]		Query query = session.createQuery(" from Servidor s  where s.unidadeOrganizacional.sigla = ?  and s.situacao IN ( '01', '04')");[/b]
			query.setString(0, sigla);
			lista = (Collection<Servidor>) query.list();
			tx.commit();

		} catch (RuntimeException e) {
			throw new AplicacaoException(e.getMessage(), e);
		}

		return lista;
	}
Criado 28 de setembro de 2009
Ultima resposta 28 de set. de 2009
Respostas 4
Participantes 2