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")
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")})publicclassAutor{@Id@GeneratedValueprivatelongid;@Column(length=30)privateStringnome;@ManyToMany(mappedBy="autores")privateCollection<Livro>livros=newArrayList<Livro>();privatelongeditora;
E o erro que deu agora com o seu Select foi justamente de mapeamento:
Exceptioninthread"main"javax.persistence.PersistenceException:[PersistenceUnit: BibliotecaPU]UnabletobuildEntityManagerFactory3639[main]INFO3795[main]ERRORorg.hibernate.hql.ast.QuerySyntaxException:autorisnotmapped[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]atorg.hibernate.hql.ast.util.SessionFactoryHelper.requireClassPersister(SessionFactoryHelper.java:158)atorg.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:677)atorg.hibernate.hql.ast.tree.FromElementFactory.addFromElement(FromElementFactory.java:87)atorg.hibernate.ejb.HibernatePersistence.createEntityManagerFactory(HibernatePersistence.java:126)atorg.hibernate.hql.ast.tree.FromClause.addFromElement(FromClause.java:70)atjavax.persistence.Persistence.createEntityManagerFactory(Persistence.java:51)atorg.hibernate.hql.ast.HqlSqlWalker.createFromElement(HqlSqlWalker.java:255)atjavax.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:
Exceptioninthread"main"javax.persistence.PersistenceException:[PersistenceUnit: BibliotecaPU]UnabletobuildEntityManagerFactory5001[main]INFO5229[main]ERRORorg.hibernate.QueryException:couldnotresolveproperty:livro_autorof: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]atorg.hibernate.persister.entity.AbstractPropertyMapping.propertyException(AbstractPropertyMapping.java:44)atorg.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:677)atorg.hibernate.persister.entity.AbstractPropertyMapping.toType(AbstractPropertyMapping.java:38)atorg.hibernate.ejb.HibernatePersistence.createEntityManagerFactory(HibernatePersistence.java:126)atorg.hibernate.persister.entity.AbstractEntityPersister.toType(AbstractEntityPersister.java:1358)atjavax.persistence.Persistence.createEntityManagerFactory(Persistence.java:51)atorg.hibernate.hql.ast.tree.FromElementType.getPropertyType(FromElementType.java:279)atjavax.persistence.Persistence.createEntityManagerFactory(Persistence.java:33)atbib.ListaMain.main(ListaMain.java:11)atorg.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!