1

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

パブリケーション.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代わりに、マップされた関係で使用する必要があります。

また、何を達成したいのかが明確ではありません。

  • 1 つのクエリで s のAuthor積極的に満たされたコレクションで sをフェッチする場合は、次を使用します。Publicationjoin fetch

    select distinct(a) from Author a join fetch a.publications where a.lastName = :lastName
    
  • Authorペア ( , )のリストを取得する場合はPublication、 regular を使用しますjoin

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