1

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

作者.java

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

出版.java

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

这些代码行生成一个名为 writes 的连接表,但是当我尝试对所有表运行查询时,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;
}
4

1 回答 1

0

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

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

  • 如果您想在一个查询中获取Author带有急切填充的 s 集合的s,请使用:Publicationjoin fetch

    select distinct(a) from Author a join fetch a.publications where a.lastName = :lastName
    
  • 如果要获取对 ( Author, Publication) 的列表,请使用常规join

    select a, p from Author a join a.publications p where a.lastName = :lastName
    
于 2012-11-30T09:18:11.947 回答