3

私にはBookとAuthorの2つのエンティティがあります。

@Entity
@Table(name="book") 
class Book {
    private int id;
    private Map<Integer, Author> authors = new HashMap<Integer, Author>();

    @Id
    @GeneratedValue
    @Column(name="id_book")
    public int getId() {
        return this.id;
    }

    @OneToMany(fetch=FetchType.EAGER)
    @JoinTable(name="book_author", joinColumns= {@JoinColumn(name="id_book")},
            inverseJoinColumns = {@JoinColumn(name="id_author", table="author")})
    @MapKeyColumn(name="order")
    public Map<Integer, Author> getAuthors() {
        return authors;
    }


}

@Entity
@Table(name="author")
class Author {

    private int id;
    private String lastname;
    private String firstname;

    @Id
    @Column(name="id_author")
    @GeneratedValue
    public int getId() {
        return id;
    }

    public String getLastname() {
        return lastname;
    }

    public String getFirstname() {
        return firstname;
    }

}

本には、特定の順序でリストされた多くの著者がいます。現在、特定の著者から特定の名または姓、あるいはその両方の本のリストを取得できるように、HQLを作成しようとしています。2つのエンティティ間の結合の使用方法について混乱しています。何か案が?

前もって感謝します。

4

1 に答える 1

7

まず、本と著者の間には1対多の関係があります。1冊の本に多くの著者を含めることができますが、1人の著者だけが1冊の本を書くことができます。実在の人物が多くの本を書いた場合、テーブルの作成者には、各本に1つずつ、多くの行が必要です。これはあなたが意図したものではないかもしれませんが、あなたはこのように関係を定義しました。

1対多の関係は、データベース側でテーブル作成者の本のIDを使用して機能します。でゲッターを作成して、このIDをJavaで使用できるようにしgetBookID()ますAuthor。次に、HQLステートメントのいずれかを使用できます

from Book b inner join Author a 
   where b.id  = a.bookId
      and a.lastname = :ln
      and a.firstname = :fn

また

from Book b where b.id in (select bookId from Author a
                              where a.lastname = :ln
                              and a.firstname = :fn)

第二に:今、あなたは一人の著者が多くの本を持つことができることを好むかもしれません。次に、多対多の関係があります。このために、多対多の関係を含むクロステーブルを導入することをお勧めします。このクロステーブルには、ブックIDと作成者IDの2つの列のみが含まれ、ブックと作成者の両方が1対多の関係にあります(作成者にはもうbookIdがありません)。HQLステートメントは、3つのテーブルを通過することを除いて、最初のケースと似ています。

編集:Book_Authorテーブルを使用:選択のために、そのテーブルにマップされるクラスBookAuthorを作成する必要があります。次に、HQLステートメントのいずれかを使用できます

from Book b inner join BookAuthor ba inner join Author a 
   where b.id  = ba.bookId
      and ba.authorId = a.id
      and a.lastname = :ln
      and a.firstname = :fn

また

from Book b where b.id in (select ba.bookId from BookAuthor ba, Author a
                              where ba.authorId = a.id
                                 and a.lastname = :ln
                                 and a.firstname = :fn)
于 2013-01-14T11:24:01.983 に答える