Hibernate - Como fazer uma query onde tenho um relacionamento muitos-para-muitos?

8 respostas
lucascaton

Bom dia galera do Guj.

Galera, estou com um probleminha simples no Hibernate: tenho duas tabelas com um relacionamento de muitos para muitos. Eu tenho um "Livro" e "Autores", onde um livro pode ter vários autores e um autor pode ser de vários livros. O meu problema é pra recuperar isso com HQL...

Minhas classes:
public class Item {	
	private Long idItem;	
	private String titulo;
	private Set autores = new HashSet();
}

public class Autor {
	private Long idAutor;
	private String descricao;
}
Meu mapeamento:
<class name="model.Item" table="item">
	<id name="idItem"><generator class="native"/></id>
	<property name="titulo" not-null="true"/>

	<set name="autores" table="Item_Autores">
		<key column="idItem"/>
		<many-to-many column="idAutor" class="model.Autor"/>
	</set>
</class>

<class name="model.Autor" table="autor">
	<id name="idAutor"><generator class="native"/></id>
	<property name="descricao" unique="true"/>
</class>

Obrigado desde já.

8 Respostas

lmprates

Vou dar um exemplo considerando que você quer pesquisar os itens certo…

Criteria crit = session.createCriteria(" From Item  item" +
                                                     " Left Join Fetch item.Autor autor " +
                                                     " where autor.descricao like 'teste%' + 
                                                     " and item.titulo like 'teste2%' ")
List<Item> list = crit.list();

Neste exemplo vocês estará selecionando uma lista de item, fazendo join com os autores, com cláusulas para o nome do autor e título do item.

[]'s

lucascaton

Olá Leandro. Obrigado pela força, mas não funcionou, porque “autores” do itens é um Set.

Eu estou tentando de outra forma agora:
http://www.guj.com.br/posts/list/104586.java

Mas também não está dando certo =/

faelcavalcanti

utilize a clausula IN para relacionamento multiplos. ele irá garantir o relacionamento dos autores associados a tal item.

lucascaton:
org.hibernate.MappingException: Unknown entity: From Item item Left Join Fetch item.Autor autor

Eu estou tentando de outra forma agora:
http://www.guj.com.br/posts/list/104586.java

Mas também não está dando certo =/


ele não está encontrando a entidade mapeada de acordo com este HQL. verifique novamente, bem como seu relacionamento. ao meu ver deveria funcionar.

lucascaton

Ele não encontra porque não é um objeto Autor e sim um Set de autores.

Como falo isso pra ele?

Obrigado.

lucascaton

Tentei das quatro formas abaixo; nenhuma funcionou :frowning:

Por favor, me dêem uma luz!
Obrigado.

R

verifica seu mapeamento no arquivo de configuração de sua classe
exemplo:

lucascaton

O meu mapeamento está lá no primeira mensagem desse post.

Vou copiá-la aqui:
<class name="model.Item" table="item">
	<id name="idItem"><generator class="native"/></id>
	<property name="titulo" not-null="true"/>

	<set name="autores" table="Item_Autores">
		<key column="idItem"/>
		<many-to-many column="idAutor" class="model.Autor"/>
	</set>
</class>

<class name="model.Autor" table="autor">
	<id name="idAutor"><generator class="native"/></id>
	<property name="descricao" unique="true"/>
</class>

Obrigado pela ajuda.

R
blz, bom o que você quer recuperar ?

por exemplo se voce quizer trazer todos os livros de um determinado autor por id do autor

tenta:

session.createCriteria(livro.class)

.setFetchMode(idautor.FetchMode.EAGER)

.setFetchMode(iddeuniao,FetchMode.EAGER)

.add(Expression.eq(idAutor, valor)

.list();

blz…

Criado 12 de setembro de 2008
Ultima resposta 27 de out. de 2008
Respostas 8
Participantes 4