我使用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;
}
答案 0 :(得分:0)
您不需要在HQL查询中明确提及连接表(此外,您甚至不能提及它们 - 仅映射实体)。您需要在映射的关系上使用join
。
此外,你想要实现的目标还不是很清楚。
如果您想在一个查询中使用热切填充的Author
个集合来抓取Publication
,请使用join 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