Hql Hibernate

7 respostas
R

fala feras

preciso montar uma query usando Hql para retornar umas informações mais não sei como faço para montar…

fiz conforme esta abaixo mais esta me retornando um erro que não pode executar a query

alguém pode ajudar

StringBuilder sql = new StringBuilder("from UsuarioTO a join a.associacoesCadastro ");
			sql.append("WHERE a.codBarras like 'S-%' and a.ID_SITUACAO_CADASTRAL = 1 AND ");
			sql.append("LEFT(associacao.dtCadastroSupervisor, 10) = '" + new SimpleDateFormat("yyyy-MM-dd").format(data) + "'");
			Query query = session.createQuery(sql.toString());
			resultado = query.list();

7 Respostas

renanreismartins

amigo, para começar nao concatene os parametros da query use o “?” no lugar da concatenação e chame o metodo setParameter do obj query para passar o valor…

poste suas classes presentes na query e o erro.

abrasss

rafaelsantini

Para entender melhor o seu problema, é interessante postar também o mapeamento das entidades e o erro que está sendo apresentado. Mas pelo que observei na sua query, acho que você está misturando as coisas, fazendo referência aos campos do banco de dados em vez dos objetos. Por exemplo, o nome da sua classe chama-se UsuarioTO e tem uma propriedade chamada ID_SITUACAO_CADASTRAL?

R

Renan eu alterei alguns detalhes ai mais aqui esta a query com a alteração

StringBuilder sql = new StringBuilder("from UsuarioTO a join a.associacoesCadastro ");
			sql.append("where a.codBarras like 'S-%' and a.estado = " + SituacaoCadastral.ATIVO);
			sql.append(" LEFT(associacao.dtCadastroSupervisor, 10) = '" + new SimpleDateFormat("yyyy-MM-dd").format(data) + "'");

a classe SituacaoCadastral e um enum
que esta assim ATIVO("Ativo", 1),

a classe UsuarioTO

@Enumerated(EnumType.ORDINAL)
	@Column(name="ID_SITUACAO_CADASTRAL")
	private SituacaoCadastral estado;
	
	@OneToMany(mappedBy="usuarioCadastro", fetch=FetchType.LAZY)
	@OrderBy("dtCadastroSistema")
	private Set<AssociacaoTO> associacoesCadastro = new HashSet<AssociacaoTO>();

e tenho a classe AssociacaoTO contem a data que esta sendo feito a busca e esta assim

@Column(name="DT_CADASTRO_SUPERVISOR")
	private Date dtCadastroSupervisor;

aqui esta a linha com a exceção

14:25:24,156 ERROR [STDERR] org.hibernate.hql.ast.QuerySyntaxException: unexpected token: LEFT near line 1, column 127 [from com.oesia.parkingrio.usuario.to.UsuarioTO a join a.associacoesCadastro where a.codBarras like 'S-%' and a.estado = Ativo LEFT(associacao.dtCadastroSupervisor, 10) = '2009-06-22']
renanreismartins

amigo acho que vc nao entendeu…

nao use concatenação dos parametros na sua query, faça algo como

Query q = session.createQuery("SELECT u FROM Usuario u WHERE u.login = :login")

q.setParameter("login", "renanreismartins");

q.list();

no seu atributo de data nao precisa fazer esse left, passe um tipo Date e na setagem de parametro especifique ele como TemporalType.DATE

q.setParameter("dtCadastroSupervisor", data, TemporalType.DATE);
R

Renan fiz dessa forma mais esta lançando a exceção que não pode executar a query,

a forma que vc setou o parametro estava dando erro de sintaxe e encontrei essa forma de fazer.

Criteria criteria = session.createCriteria(AssociacaoTO.class);
			StringBuilder sql = new StringBuilder("from UsuarioTO a join a.associacoesCadastro ");
			sql.append("where a.codBarras like 'S-%' and a.estado = " + SituacaoCadastral.ATIVO);
			Query query = session.createQuery(sql.toString());
			criteria.createCriteria("associacaoTO").add(Expression.le("dtCadastroSupervisor", data));

a exceção

ERROR [STDERR] org.hibernate.exception.SQLGrammarException: could not execute query
renanreismartins

velho da certo sim eh soh da uma estudadinha que vai… NAO EXISTE COISA MAIS FEIA que esse lance de fica concatenando String pra monta os parametros da query.

Se acha mais facil tente montar sua query com Criteria entao… mas misturar os dois fica estranho.

edit-----
posta o erro que aconteceu qdo vc fez setando o parametro pelo metodo
edit-----

abrassss

R

consegui feras vou postar aqui para futuras duvidas

valeu a todos

StringBuilder sql = new StringBuilder("from UsuarioTO a inner join fetch a.associacoesSupervisor as s ");
			sql.append("where a.codBarras like 'S-%' and a.estado = 1 ");	
			sql.append("and s.dtDevolucaoSupervisor BETWEEN :dtInicial AND :dtFinal" );
			Query query = session.createQuery(sql.toString());
			Date dtInicial = (Date)data.clone();
			dtInicial.setHours(00);
			dtInicial.setMinutes(00);
			dtInicial.setSeconds(00);
			Date dtFinal = (Date)data.clone();
			dtFinal.setHours(23);
			dtFinal.setMinutes(59);
			dtFinal.setSeconds(59);
			query.setParameter("dtInicial", dtInicial);
			query.setParameter("dtFinal", dtFinal);
			resultado = query.list();
Criado 22 de outubro de 2009
Ultima resposta 28 de out. de 2009
Respostas 7
Participantes 3