Left Join em hibernate com Criteria

6 respostas
V

Ola,
Estou construindo uma aplicação que faz uso do Hibernate, estou com um certo problema quanto tento fazer um lef join usando criteria.

Criteria select = sessao2.createCriteria(Estabelecimento.class) .setFetchMode("item", FetchMode.EAGER) .add(Example.create(x)) ;

Oque esta acontecendo eh que esta retornado o mesmo objeto Estabelecimento 3 vezes, pois ele possui 3 Item. Como faço pra ele retornar o objeto apenas uma vez.

Obrigado

6 Respostas

T

Tudo bem?

Cara, tenta o seguinte:

Criteria select = sessao2.createCriteria(Estabelecimento.class)   
                            .setFetchMode("item", FetchMode.JOIN)   
                            .add(Example.create(x)) ;

Qualquer coisa post de novo aqui!

Um abraço,

Tubarão

V

Ja tentei isso tb mas não deu certo, tentei de outra forma:

Query select = sessao2.createQuery("from Estabelecimento estab left join fetch estab.item where estab.nome = 'Cultura'");

Tambem não deu certo retornou 3 vezes o mesmo objeto. Sera que é alguma coisa com o mapeamento das classes? vou colocar aqui o codigo dos XML de mapeamento.

Estabelecimento:
<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE hibernate-mapping 
	PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>

	<class name="persistencia.Estabelecimento">
	
		<id name="id" type="java.lang.Integer">
			<generator class="increment"/>
		</id>
		
		<property name="nome"		type="string" column="nome"/>
		<property name="ramo"		type="string" column="ramo"/>
	
		<set name="item"
			 inverse="true"
			 cascade="save-update">
		
			<key column="Estabelecimento_id"/>
			<one-to-many class="persistencia.Item"/>
		
		</set>
	
	</class>

</hibernate-mapping>
Item
<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE hibernate-mapping 
	PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>

	<class name="persistencia.Item">
	
		<id name="id"	type="java.lang.Integer">
			<generator class="increment"/>
		</id>
	
		<property name="nome"	type="string" column="nome"/>
		<property name="tipo"	type="string" column="tipo"/>
		<property name="preco"	type="int" column="preco"/>
		<many-to-one 
				name="estabelecimento"
				class="persistencia.Estabelecimento"
				column="Estabelecimento_id"
				/>

			
	</class>
	
	
</hibernate-mapping>

Vlw

R

veja se esse exemplo te atende: http://www.java2s.com/Code/Java/Hibernate/CriteriaDistinctCriteria.htm

adicionando DISTINCT no seu criteria.

V

Maravilha funcionou agora. O codigo ficou assim.

Criteria select = sessao2.createCriteria(Estabelecimento.class)
							.setFetchMode("item", FetchMode.EAGER)
							.add(Example.create(x))
							.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY)
							;

Vlw

G

Usei essa forma aqui, mas esta propriedade FetchMode.EAGER e FetchMode.LAZY está deprecatado.

Tem outra maneira de fazer esse join e alterar o FechMode? Precisava justamente destes dois.

M

Na documentação são mostrados os substitutos:

EAGER
Deprecated. use FetchMode.JOIN
LAZY
Deprecated. use FetchMode.SELECT

Criado 1 de novembro de 2007
Ultima resposta 10 de nov. de 2011
Respostas 6
Participantes 5