2012-11-30 35 views
1

我使用Spring和Hibernate建立了一個數據庫應用程序,並且使用了多對多關係。 下面的代碼:org.hibernate.hql.internal.ast.QuerySyntaxException:寫入未映射

Author.java

@ManyToMany(cascade = {CascadeType.ALL}) 
@JoinTable(name = "writes", joinColumns = {@JoinColumn(name = "authorId")}, inverseJoinColumns = {@JoinColumn(name = "publicationId")}) 
private Set<Publication> publications = new HashSet<Publication>(); 

Publication.java

@ManyToMany(mappedBy = "publications") 
private Set<Author> authors = new HashSet<Author>(); 

這幾行代碼生成一個名爲一個連接表寫,但是當我嘗試通過運行一個查詢所有的表int給我錯誤,在上面命名。

這是方法,即schould運行查詢:

@Transactional 
public List<Author> findAuthorByLastname(String lastName) { 
    String hql = "from Author a, Publication p, writes w where a.id = w.authorId and p.id = w.publicationId and a.lastname = :lastName"; 
    Query q = sessionFactory.getCurrentSession().createQuery(hql); 
    q.setParameter("lastName", lastName); 
    List<Author> result = q.list(); 
    return result; 
} 

回答

0

你不需要明確提到的連接表中HQL查詢(此外,你甚至不能提及他們 - 不僅映射實體)。您需要在映射關係上使用join

此外,它不是很清楚你想達到什麼。

  • 如果你想在一個查詢中獲取Author s的他們Publication S的熱切填充集合,使用join fetch

    select distinct(a) from Author a join fetch a.publications where a.lastName = :lastName 
    
  • 如果你想獲取(對列表AuthorPublication ),使用普通join

    select a, p from Author a join a.publications p where a.lastName = :lastName 
    
+0

感謝您的提示! 我從來不喜歡加入運算符,但似乎我必須熟悉它! ;) 我有另一個問題:選擇*不起作用的HQL ..最新的替代方案? – bethlis