2013-01-14 58 views
1

我有兩個實體,Book和Author。用於搜索的HQL查詢(一對多關係)

@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,以便我可以從特定作者那裏獲取特定姓氏或姓氏或兩者的書籍列表。我很困惑如何使用兩個實體之間的連接。任何想法?

在此先感謝。

回答

3

第一:書籍和作者之間有一對多的關係。一本書可以有很多作者,但是一個作者只能寫一本書。如果一個真人寫了很多書,那麼他在書桌作者中需要很多行,每個書都有一行。這可能不是你想要的,但是你已經定義了這樣的關係。

一對多關係在表格作者中使用書的id在數據庫端工作。通過在Author中創建一個吸氣器getBookID(),使該ID在Java中可用。然後你可以使用的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,書和作者都有一對多的關係(作者沒有bookId了)。 HQL語句與第一種情況相似,只不過它們超過了三個表。

編輯:使用您的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 BookAuthorba, Author a 
           where ba.authorId = a.id 
           and a.lastname = :ln 
           and a.firstname = :fn) 
+0

,因爲我不想綁定筆者到某本書作爲一個作家可以寫很多書我沒在筆者添加任何idBook 。其實我的困惑是我如何鏈接三個表格,因爲我有一個作者類和一個Book類,他們的鏈接在數據庫的book_author表中定義。我不明白他們是如何在課堂上表現的,或者我如何在HQL中表現他們。任何想法? – suenda

+0

我編輯了我的答案。往上看;你必須爲連接表創建一個類。 – Johanna

+0

感謝您的幫助。我希望沒有創建BookAuthor,但似乎我必須創建它,我會這樣做。再次感謝您的幫助 – suenda