Olá a todos,
Estou desenvolvendo um sistema o qual possui um relacionamento equivalente ao a seguir: Docente extends Concurso. Esse foi mapeado como uma joined-subclass:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping SYSTEM
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="br.unesp.ourinhos.model">
<joined-subclass name="Docente" extends="Concurso">
<key column="idConcurso" foreign-key="pk_fk_concurso"/>
<property name="carater" type="string" length="60" not-null="true"/>
<set name="disciplinas" table="Disciplinas" inverse="true">
<key column="idConcurso" not-null="true"/>
<many-to-many class="Disciplina"/>
</set>
</joined-subclass>
</hibernate-mapping>
O mapeamento funcionou perfeitamente, no entanto, quando executo o método abaixo, o Hibernate gera uma junção externa pela direita que retorna dados indesejados.
@SuppressWarnings("unchecked")
public List<Concurso> getNextTendersByYear( Integer year ) {
List<Concurso> result = (List<Concurso>)super.getSession().createCriteria( Concurso.class )
.add( Restrictions.sqlRestriction( "EXTRACT( YEAR FROM dataPublicacao ) = " + year ) )
.add( Restrictions.eq( "encerrado", 'N' ) )
.add( Restrictions.gt( "inicioInscricao", new Date() ) )
.list();
return result;
}
O código SQL gerado é o seguinte:
select
this_.idConcurso as idConcurso0_0_,
this_.cargo as cargo0_0_,
this_.numeroVagas as numeroVa3_0_0_,
this_.dataPublicacao as dataPubl4_0_0_,
this_.inicioInscricao as inicioIn5_0_0_,
this_.terminoInscricao as terminoI6_0_0_,
this_.urlInscricao as urlInscr7_0_0_,
this_.encerrado as encerrado0_0_,
this_.ativo as ativo0_0_,
this_1_.carater as carater5_0_,
case
when this_1_.idConcurso is not null then 1
when this_.idConcurso is not null then 0
end as clazz_0_
from
Concurso this_
left outer join
Docente this_1_
on this_.idConcurso=this_1_.idConcurso
where
EXTRACT( YEAR FROM dataPublicacao ) = 2011 and
this_.encerrado=? and
this_.inicioInscricao>?
A minha pergunta é a seguinte: [color=red]como eu faço para que o Hibernate não gere essa junção externa pela direita (left outer join) utilizando criteria?[/color]