org.hibernate.hql.internal.ast.QuerySyntaxException:未映射写入

时间:2012-11-30 08:40:03

标签: spring hibernate many-to-many

我使用Spring和Hibernate建立了一个数据库应用程序,并且我正在使用多对多关系。 这是代码:

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>();

这些代码行生成一个名为writes的连接表,但是当我尝试对所有Tables运行查询时,int给出了错误,如上所述。

这是方法,可以运行查询:

@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;
}

1 个答案:

答案 0 :(得分:0)

您不需要在HQL查询中明确提及连接表(此外,您甚至不能提及它们 - 仅映射实体)。您需要在映射的关系上使用join

此外,你想要实现的目标还不是很清楚。

  • 如果您想在一个查询中使用热切填充的Author个集合来抓取Publication,请使用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