Dúvida com Query no Hibernate

9 respostas
R

Ae pessoal, blza?

Estou com uma dúvida de como fazer a seguinte query:

<query name = "atendimentoById"> <![CDATA[from Atendimento a left join fetch a.usuario left join fetch a.administrador left join fetch a.tipo left join fetch a.status left join fetch a.produto left join fetch a.caracteristica left join fetch a.mensagens where a.id = :id]]> </query>

Todos os relacionamentos são many-to-one com exceção das mensagens que é um set(one-to-many).

O problema é que eu preciso pegar as mensagens ordenadas e não estou conseguindo, quando eu coloco um order by na query acima o hibernate da erro. Qual a maneira correta para pegar as mensagens ordenadas?

Agradeço desde já.

9 Respostas

Pablo_Eteg

Em que local vc ta colocando o order by?

R

Eu estava colocando o order by depois do where.

Se eu colocar “order by a.mensagens.id” (Id é uma propriedade da classe mensagem), o hibernate vai lançar a seguinte exceção: org.hibernate.QueryException: illegal attempt to dereference collection [atendiment0_.Id.mensagens] with element property reference [id]

Não tenho certeza, mas acho que é porque eu não posso ordenar pelo id das mensagens depois o join já foi feito, na hora de fazer o join as mensagens já devem estar ordenadas, só que eu não estou sabendo fazer isso. :frowning:

Vlw pela atenção

nbluis

Tente assim

<query name = "atendimentoById">  
         <![CDATA[from Atendimento a  
         left join fetch a.usuario   
         left join fetch a.administrador     
         left join fetch a.tipo     
         left join fetch a.status     
         left join fetch a.produto     
         left join fetch a.caracteristica  
         left join fetch a.mensagens as mensagens
         where a.id = :id
         order by mensagens.id
         ]]>  
        </query>
R

A query rodou, só que quando eu pego o meu Set e gero um Iterator as mensagens continuam desordenadas (meio que aleatório).

O erro é na consulta ou na forma como estou pegando o resultando?

Vlw pela ajuda.

nbluis

O contrato da interface Set não garante que a ordenação seja mantida de acordo com a inserção.
Por isso deve estar dando problema.

Utilize uma List.

R

Com List funcionou, obrigado pela ajuda! :slight_smile:

R

Eu tenho mais uma dúvida. A lista foi mapeada assim:

<list name="mensagens" inverse="true" cascade="all-delete-orphan"> <key column = "Id_atendimento" /> <index column="id" /> <one-to-many class = "Mensagem" /> </list>

Posso ter vários atendimentos, que por usa vez possuem várias mensagens. Quando estou pegando mensagens de um atendimento, várias posições da lista vem como null (que são os ids das mensagens que não pertencem ao meu atendimento). Quando eu pego o iterator deste List ele também pega esse “lixo”.

Minha dúvida: Eu fiz o mapeamento errado? É assim mesmo? Como eu faço pra não ter esse lixo, ou eu tenho que tirar tudo que é null no java mesmo?

Pablo_Eteg
&lt;list name="mensagens" inverse="true" cascade="all-delete-orphan" outer-join="auto"&gt;  
             &lt;key column = "Id_atendimento" /&gt;  
             &lt;index column="id" /&gt;  
             &lt;one-to-many class = "Mensagem" /&gt;
  
 &lt;/list&gt;

Tenta adicionar um outer-join, se naum funcionar onde eu coloquei tenta
colocar dentro da tag <one-to-many class = “Mensagem” outer-join=“auto”/>

R

Eu não cheguei a testa o que você sugeriu porque eu tinha acabado de achar uma solução.
Depois de muito google, eu achei essa página do hibernate http://www.hibernate.org/hib_docs/v3/reference/en/html/collections.html#collections-indexed

É possível ordenar o set se colocar assim:

<set name="mensagens" inverse="true" cascade="all-delete-orphan" order-by="id asc"> <key column = "Id_atendimento" /> <one-to-many class = "paiva.ca.models.Mensagem" /> </set>

A propriedade order-by consegue trazer o set ordenado.

Obrigado pela ajuda!

Criado 3 de janeiro de 2008
Ultima resposta 4 de jan. de 2008
Respostas 9
Participantes 3