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
Tubarao
Novembro 1, 2007, 2:58pm
#2
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
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:
[code]<?xml version="1.0" encoding="UTF-8"?>
<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>
[/code]
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
veja se esse exemplo te atende: http://www.java2s.com/Code/Java/Hibernate/CriteriaDistinctCriteria.htm
adicionando DISTINCT no seu criteria.
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
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.
Na documentação são mostrados os substitutos:
EAGER
Deprecated. use FetchMode.JOIN
LAZY
Deprecated. use FetchMode.SELECT