Gostaria de saber se alguem ja teve o seguinte problema:
Quando feita uma query com a criteria o sql gerado em sua clausula from utiliza para os relacionamentos, corretamente, left outer join, mas quando na consulta é adicionado por exemplo um order para algum dos atributos de classes associadas que podem ser nulos, é utilizado inner join.
Quero que ele utilize left outer join, trazendo assim, mesmo os registros que possuam o atributo ou classe nulos.
Ex.:
<hibernate-mapping package="br.com....">
<class name="Cidade" table="cidade">
<id
column="cod_cid"
name="codigo"
type="java.lang.Long"
>
<generator class="assigned" />
</id>
<property
column="descricao"
name="descricao"
not-null="true"
type="java.lang.String"
/>
<many-to-one
class="br.com.....Regiao"
name="regiao"
not-null="true"
>
<column name="cod_regiao" />
</many-to-one>
</class>
</hibernate-mapping>
<hibernate-mapping package="br.com....">
< class name="Regiao" table="regiao" >
<id
name="codigo"
type="java.lang.Long"
column="cod_regiao"
>
<generator class="assigned" />
</id>
<property
name="descricao"
column="descricao"
type="java.lang.String"
not-null="true"
/>
</class>
</hibernate-mapping>
Session s = HibernateSessionFactory.getSession();
Criteria criteria = s.createCriteria(Cidade.class);
Criteria cPais = criteria.createCriteria("regiao").addOrder( Order.asc("codigo") );
List list = criteria.list();
O retorno correto, considerando que a tabela cidade tenha 15 registro, seriam 15 registros ordenados pelo codigo da regiao, mas, nesse caso, se alguma cidade possuir o estado null, são retornados 14 registros.
Tentei utilizar setFetchMode aplicando ao path “pais” setando FetchMode.JOIN, FetchMode.SELECT e FetchMode.DEFAULT sem sucesso.
Em pesquisa recente encontrei um post no forum do hibernate de 10 de outubro de 2004 com uma sugestão que consiste na alteração de um metodo da classe CriteriaLoader do código fonte do hibernate.
http://forum.hibernate.org/viewtopic.php?t=940120&highlight=left+join+criteria
Mudeu o fonte do hibernate e funcionou :), mas, acho que isso não é uma boa idéia.
[]s