'left outer join' com Hibernate Query Language

EDIT: Só aproveitando o tópico sobre hibernate.

Como fazer um left outer join com HQL?

Minha HQL é o seguinte.

select s.professor as pS, l.professor as pL
FROM Lancamento l, HorasPagar hp,Substituicao s
WHERE hp.key.lancamento = l
AND s.lancamentoID = l.lancamentoID
AND l.filial.filialID = :filial
AND l.anoMesCompetencia = :comp

Preciso que seja left outer join s.lancamentoID = l.lancamentoID. Já tentei passar explicitamente como:

select s.professor as pS, l.professor as pL
FROM Lancamento l, HorasPagar hp
left outer join Substituicao s on s.lancamentoID = l.lancamentoID
WHERE hp.key.lancamento = l
AND l.filial.filialID = :filial
AND l.anoMesCompetencia = :comp

Mas nao funciona.

Me disseram que é apenas um simbolo que eu coloco do lado do join que quero fazer, mas quem me disse não lembrava qual era e não achei na internet.


Duvidas abaixos já resolvidas

/ Duvida sem solução /
Bem, resolvi realmente criando um ID, era a unica solução possivel.

Como eu mapeio uma tabela sem ID?
Eu procurei e vi que da pra marcar um campo como @Id que pro hibernate não faz diferença, ele até fez isso, o problema é que tem mais de um registro com esse mesmo valor, então a seguinte exception é lançada.

Caused by: org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session: [br.com.model.MotivoSubstituicao#4563]

/ Duvida já resolvida /

Olá, estou tentando fazer o delete de uma entidade que tem o seguinte mapeamento.

	@OneToMany(cascade = CascadeType.ALL)
	@Cascade(org.hibernate.annotations.CascadeType.DELETE_ORPHAN)
	@JoinTable(name = "substituicaoatividades", joinColumns = { @JoinColumn(name = "lancamentoID") }, inverseJoinColumns = { @JoinColumn(name = "atividadeID") })
	public Set<Atividade> getAtividades() {
		return atividades;
	}

E para deletar ambos os métodos não funcionam.

		Session s = currentSession();
		Transaction t = s.beginTransaction();
		SQLQuery query = s.createSQLQuery("delete from SubstituicaoAtividades where lancamentoID = '"+substituicao.getLancamentoID()+"'");
		query.executeUpdate();
		s.delete(substituicao);
		t.commit();
		Session s = currentSession();
		Transaction t = s.beginTransaction();
		s.delete(substituicao);
		t.commit();

A Exception lançada é:

2010-08-30 14:39:30,752 ERROR [org.hibernate.util.JDBCExceptionReporter] The DELETE statement conflicted with the REFERENCE constraint "FK__MotivoSub__lanca__216BEC9A". The conflict occurred in database "MasCambridge", table "dbo.MotivoSubstituicao", column 'lancamentoID'.
2010-08-30 14:39:30,752 ERROR [org.hibernate.event.def.AbstractFlushingEventListener] Could not synchronize database state with session
org.hibernate.exception.ConstraintViolationException: could not delete: [br.com.model.Substituicao#4553]

seu onetomany não tem uma propriedade orphanRemoval? qual a versão do hibernate?

Que propriedade OrphanRemoval??

2010-08-30 14:54:14,316 INFO  [org.hibernate.cfg.annotations.Version] Hibernate Annotations 3.2.0.CR1
2010-08-30 14:54:14,347 INFO  [org.hibernate.cfg.Environment] Hibernate 3.2 cr2

@OneToMany(cascade={CascadeType.REMOVE},orphanRemoval=true) private List<Horario> horarios = new ArrayList<Horario>();
aqui tem isso

Certeza que é javax.persistence.OneToMany?

E modifiquei para cascade={CascadeType.REMOVE}
Também não deu certo.

sim, javax.persistence :slight_smile:
tente assim: cascade={CascadeType.ALL, CascadeType.REMOVE}

Já tento, enquanto isso.

Nem o seguinte código funciona.

			Session s = DAOSession.currentSession();
			Transaction t = s.beginTransaction();
			SQLQuery query = s
					.createSQLQuery("delete from SubstituicaoAtividades where lancamentoID ='"
							+ substituicao.getLancamentoID()+"'");
			SQLQuery delete = s.createSQLQuery("delete from Substituicao where lancamentoID ='"+substituicao.getLancamentoID()+"'");
			query.executeUpdate();
			delete.executeUpdate();
			t.commit();

Caso não existir elementos na tabela de relacionamento ele não devia lançar esse erro não é?
Em que caso ele lança essa exception?

Nossa, eu tava viajando, esse não é o meu problema.

E eu estava procurando o conflito nessa outra. =/

Resolvido

Duvida diferente no primeiro post. /\

Ninguém nunca tentou mapear uma tabela sem @Id?

Continuei procurando na internet e só vejo que as pessoas não tem solução para esse problema.

Eu consegui pensar em algo, mas é só gambiarra =/

Nova duvida sobre HQL no primeiro post.

Obrigado.

Fala Marquinhos, ontem eu falei que tinha um operador igual o (+) do oracle ou o *= do sqlserver mais eu acho que tava errado não achei nada sobre isso :frowning:

from Cat as cat left join cat.mate.kittens as kittens

http://docs.jboss.org/hibernate/core/3.3/reference/en/html/queryhql.html#queryhql-joins

Qual erro vc ta tendo?

select s.professor as pS, l.professor as pL   
FROM Lancamento l, HorasPagar hp   
left outer join Substituicao s on s.lancamentoID = l.lancamentoID   
WHERE hp.key.lancamento = l  
AND l.filial.filialID = :filial   
AND l.anoMesCompetencia = :comp  

Eu não sei se vc pode misturar Where e inner join assim como vc fez, tenta escrever um join entre a tabela Lancamento e HorasPagar no lugar desse WHERE saca o que eu quero dizer?

hp.key.lancamento = l  

Talvez algo parecido com:

select s.professor as pS, l.professor as pL   
FROM Lancamento join HorasPagar hp on hp.key.lancamento = l    
left outer join Substituicao s on s.lancamentoID = l.lancamentoID   
WHERE hp.key.lancamento = l  
AND l.filial.filialID = :filial   
AND l.anoMesCompetencia = :comp  

Meus problemas usando com * ou (+) é unespected token, ele nem faz o parse da query.

Tentando como voce disse

select s.professor as pS, l.professor as pL, hp.key.atividade as ativ, 
FROM Lancamento l inner join HorasPagar hp hp.key.lancamento = l 
left outer join Substituicao s s.lancamentoID = l.lancamentoID 
WHERE 
l.filial.filialID = :filial 
AND l.anoMesCompetencia = :comp 

Lança esse problema
unexpected token: hp near line 1, column 188

Já tentei com ‘as’ também não funcionou.

Engraçado.

A seguinte HQL lança NullPointerException

select  l.professor as pL 
FROM Lancamento l 
inner join HorasPagar hp with hp.key.lancamento = l 
WHERE 
l.filial.filialID = :filial 
AND l.anoMesCompetencia = :comp 

StackTrace completa.

13:22:36,061 ERROR [STDERR] java.lang.NullPointerException
13:22:36,077 ERROR [STDERR]     at org.hibernate.hql.ast.HqlSqlWalker.setAlias(H
qlSqlWalker.java:853)
13:22:36,077 ERROR [STDERR]     at org.hibernate.hql.antlr.HqlSqlBaseWalker.alia
sedSelectExpr(HqlSqlBaseWalker.java:2065)
13:22:36,077 ERROR [STDERR]     at org.hibernate.hql.antlr.HqlSqlBaseWalker.sele
ctExprList(HqlSqlBaseWalker.java:1828)
13:22:36,077 ERROR [STDERR]     at org.hibernate.hql.antlr.HqlSqlBaseWalker.sele
ctClause(HqlSqlBaseWalker.java:1392)
13:22:36,077 ERROR [STDERR]     at org.hibernate.hql.antlr.HqlSqlBaseWalker.quer
y(HqlSqlBaseWalker.java:553)
13:22:36,077 ERROR [STDERR]     at org.hibernate.hql.antlr.HqlSqlBaseWalker.sele
ctStatement(HqlSqlBaseWalker.java:281)
13:22:36,077 ERROR [STDERR]     at org.hibernate.hql.antlr.HqlSqlBaseWalker.stat
ement(HqlSqlBaseWalker.java:229)
13:22:36,077 ERROR [STDERR]     at org.hibernate.hql.ast.QueryTranslatorImpl.ana
lyze(QueryTranslatorImpl.java:227)
13:22:36,077 ERROR [STDERR]     at org.hibernate.hql.ast.QueryTranslatorImpl.doC
ompile(QueryTranslatorImpl.java:159)
13:22:36,077 ERROR [STDERR]     at org.hibernate.hql.ast.QueryTranslatorImpl.com
pile(QueryTranslatorImpl.java:110)
13:22:36,077 ERROR [STDERR]     at org.hibernate.engine.query.HQLQueryPlan.<init
>(HQLQueryPlan.java:77)
13:22:36,077 ERROR [STDERR]     at org.hibernate.engine.query.HQLQueryPlan.<init
>(HQLQueryPlan.java:56)
13:22:36,077 ERROR [STDERR]     at org.hibernate.engine.query.QueryPlanCache.get
HQLQueryPlan(QueryPlanCache.java:71)
13:22:36,077 ERROR [STDERR]     at org.hibernate.impl.AbstractSessionImpl.getHQL
QueryPlan(AbstractSessionImpl.java:133)
13:22:36,077 ERROR [STDERR]     at org.hibernate.impl.AbstractSessionImpl.create
Query(AbstractSessionImpl.java:112)
13:22:36,077 ERROR [STDERR]     at org.hibernate.impl.SessionImpl.createQuery(Se
ssionImpl.java:1612)

Hmm… descobri mais um pouco.

FROM HorasPagar hp 
inner join hp.key.lancamento as l 

Isso funciona, só falta relacionar o join da Substituicao.

Acho que está faltando justamente o join com a filial. Não conheço seu modelo mas…

select s.professor as pS, l.professor as pL
FROM Lancamento l
left outer join Filial f
left outer join  HorasPagar hp
left outer join Substituicao s
WHERE hp.key.lancamento = :l
AND f.filialID = :filial
AND l.anoMesCompetencia = :comp

Então, não consigo colocar apenas.

left join Substituicao s

E colocar a clausula no where. A seguinte mensagem é mostrada

Path expected for join!

Já tentei

left join Substituicao s on s.lancamentoID = l.lancamentoID
left join Substituicao s with s.lancamentoID = l.lancamentoID

Nenhuma funciona.

Sobre o relacionamento com filial, resolvi da seguinte maneira.

select  l.professor as pL 
FROM HorasPagar hp 
inner join hp.key.lancamento as l 
inner join l.filial as f 
WHERE 
f.filialID = :filial 
AND l.anoMesCompetencia = :comp 

Só falta o da Substituição, o problema é que ele não se relaciona diretamente com as propriedades, preciso passar o “s.lancamentoID = l.lancamentoID”

Ha… descobri que é impossivel colocar ‘on’ com HQL.

http://jumpingbean.co.za/blogs/mark/hibernate_hql_inner_join_on_clause
https://forum.hibernate.org/viewtopic.php?t=971401

Vou ter que recorrer a SQL nativa =/