@ManyToMany Select em tabela associada hibernate

14 respostas
luke86

Bom dia pessoal!
Sou novato em Java e estou com um problema urgente no hibernate.
Eu tenho uma tabela autor e uma tabela livro, que através do mapeamento forma uma nota tabla chamda livro_autor.
Só que não consigo usar ela no hibernate, no banco retorna certo, mais no hibernate da erro!
Vcs poderiam me ajudar?
To usando o seguinte select no hibernate:

@NamedQuery(name = "Autor.findAll",query="SELECT a.nome,l.titulo,e.nome FROM autor a "
                                 + "JOIN livro_autor la ON (la.livros_id = a.id) "
                                 + "JOIN livro l ON (la.livros_id = l.id) LEFT JOIN editora e ON (e.id_autor = a.id) "
                                 + "where a.nome like :x")

Vlw

14 Respostas

F

ja fizeste alguma query funcionar?

como estão teus mapeamentos? me parece estranho esses join

tente algo como

SELECT a.nome,l.titulo,e.nome FROM autor a "  
                                 + "JOIN a.livro_autor la "  
                                 + "JOIN la.livro l  LEFT JOIN a.editora "  
                                 + "where a.nome like :x")
renanreismartins

luke, de uma estudada em HQL, vai te ajudar muito.

Agora caso queira realmente executar uma query escrita em sql vc terá de usar a anotação @NamedNativeQuery

abrasss

luke86

Minhas classes estão assim

@Entity
@NamedQueries({
                @NamedQuery(name = "Autor.findAll",query="SELECT a.nome,l.titulo,e.nome FROM autor a "    
                                 + "JOIN a.livro_autor la "    
                                 + "JOIN la.livro l  "
                                 + "LEFT JOIN a.editora "    
                                 + "where a.nome like :x"),
                @NamedQuery(name = "Autor.findId", query="SELECT a.nome,l.titulo,e.nome FROM autor a "    
                                 + "JOIN a.livro_autor la "    
                                 + "JOIN la.livro l  "
                                 + "LEFT JOIN a.editora "    
                                 + "where a.id =:x")})
public class Autor {
    @Id  
    @GeneratedValue 
    private long id;    
    @Column(length=30)
    private String nome;
    @ManyToMany(mappedBy="autores")
    private Collection<Livro> livros = new ArrayList<Livro>();    
    private long editora ;
public class Livro {
    
    @Id  
    @GeneratedValue 
    private long id;    
    @Column(length=30)
    private String titulo;        
    private long editora ;
public class Editora {
    @Id
    @GeneratedValue
    private long id ;
    @Column(length=30)
    private String nome ;                
    private long autor ;
    @ManyToMany
    private Collection<Livro> livros = new ArrayList<Livro>() ;

E o erro que deu agora com o seu Select foi justamente de mapeamento:

Exception in thread "main" javax.persistence.PersistenceException: [PersistenceUnit: BibliotecaPU] Unable to build EntityManagerFactory
3639 [main] INFO 3795 [main] ERRORorg.hibernate.hql.ast.QuerySyntaxException: autor is not mapped [SELECT a.nome,l.titulo,e.nome FROM autor a JOIN a.livros la JOIN la.livro l  LEFT JOIN a.editora where a.nome like :x]
	at org.hibernate.hql.ast.util.SessionFactoryHelper.requireClassPersister(SessionFactoryHelper.java:158)
	at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:677)
	at org.hibernate.hql.ast.tree.FromElementFactory.addFromElement(FromElementFactory.java:87)
	at org.hibernate.ejb.HibernatePersistence.createEntityManagerFactory(HibernatePersistence.java:126)
	at org.hibernate.hql.ast.tree.FromClause.addFromElement(FromClause.java:70)
	at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:51)
	at org.hibernate.hql.ast.HqlSqlWalker.createFromElement(HqlSqlWalker.java:255)
	at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:33)
luke86

renanreismartins:
luke, de uma estudada em HQL, vai te ajudar muito.

Agora caso queira realmente executar uma query escrita em sql vc terá de usar a anotação @NamedNativeQuery

abrasss

Opa, valew pela dica!
Eu pretendo estudar o HQL, mas eu to apurado aqui com esse tróço que não anda hahah

renanreismartins

A classe autor nao deve ter como atributo um long com id da editora, e sim a referencia ao objeto editora.

O mesmo acontece na classe Editora com o atributo autor.

aqui no guj e nas apostilas da caelum tem uma introducao bem legal de ORM.

abrassss

renanreismartins

mas não adianta ir no EXTREME GO HORSE… é importante estudar oque está fazendo… =/

Hebert_Coelho

Você escreveu autor com letra minúscula. Troque para Autor. Tem que ser o nome da classe, e não da tabela.

luke86

Pessoal, ainda to parado com isso!

O meu código ta desse maneira agora:

@NamedQuery(name = "Autor.findAll",query="SELECT a.nome,l.titulo,e.nome FROM Autor a "    
                                 + "JOIN a.livros la "    
                                 + "JOIN la.livro l  "
                                 + "LEFT JOIN a.editora "    
                                 + "where a.nome like :x")

Os mapeamentos estão blza agora, só o comando que naum roda!

O erro é o seguinte:

Exception in thread "main" javax.persistence.PersistenceException: [PersistenceUnit: BibliotecaPU] Unable to build EntityManagerFactory
5001 [main] INFO 5229 [main] ERRORorg.hibernate.QueryException: could not resolve property: livro_autor of: Entities.Autor [SELECT a.nome,l.titulo,e.nome FROM Entities.Autor a JOIN a.livro_autor la JOIN la.livros_id l  LEFT JOIN a.editora where a.nome like :x]
	at org.hibernate.persister.entity.AbstractPropertyMapping.propertyException(AbstractPropertyMapping.java:44)
	at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:677)
	at org.hibernate.persister.entity.AbstractPropertyMapping.toType(AbstractPropertyMapping.java:38)
	at org.hibernate.ejb.HibernatePersistence.createEntityManagerFactory(HibernatePersistence.java:126)
	at org.hibernate.persister.entity.AbstractEntityPersister.toType(AbstractEntityPersister.java:1358)
	at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:51)
	at org.hibernate.hql.ast.tree.FromElementType.getPropertyType(FromElementType.java:279)
	at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:33)
	at bib.ListaMain.main(ListaMain.java:11)
	at org.hibernate.hql.ast.tree.FromElement.getPropertyType(FromElement.java:386)
Hebert_Coelho

Pq vc está fazendo isso? SELECT a.nome,l.titulo,e.nome FROM Autor a

pq vc simplesmente não faz select a from Autor a … ?

Hebert_Coelho

Outra coisa, a.livros… Você tem getLivros na classe autor??

luke86

jakefrog:
Pq vc está fazendo isso? SELECT a.nome,l.titulo,e.nome FROM Autor a

pq vc simplesmente não faz select a from Autor a … ?

Pq os dados não estão todos na tabela autor!

renanreismartins

se autor tem uma editora, vc pode simplismente fazer a query por autor como disse o jakefrog e entao fazer autor.getEditora()

abrassss

luke86

renanreismartins:
se autor tem uma editora, vc pode simplismente fazer a query por autor como disse o jakefrog e entao fazer autor.getEditora()

abrassss


O problema é um Select na tabela associada livro_autor

luke86

Pessoal agradeço pelas dicas!
Consegui resolver a parada. É só exercutar um select normal e usar os atributos da classe!
Mais uma vez muito obrigado por que me ajudou postando no tópico!

Moderador já pode por resolvido!

Criado 8 de dezembro de 2011
Ultima resposta 13 de dez. de 2011
Respostas 14
Participantes 4