2012-08-28 34 views
1

我有這樣的問題:休眠 - 加入三次同桌

兩個表

tbl_suppliers 
    id* (int), 
    name (string), 
    activity1 (int), 
    activity2 (int), 
    activity3 (int) 

tbl_activity 
    id* (int), 
    description (string) 

有一種「一個一對多」兩和表之間的關係: tbl_activity(one) - >tbl_suppliers(many);這意味着每個供應商都可以爲每項活動或甚至沒有活動填寫所有三個ID(無ID)。

我需要顯示的tbl_suppliers的列nameactivity1activity2activity3記錄。

在SQL它的確定與此查詢:

SELECT s.id, s.name, a1.description activitystring1, 
    a2.description activitystring2, a3.description activitystring3 
FROM tbl_suppliers s 
LEFT JOIN tbl_activity a1 ON (s.activity1=a1.id) 
LEFT JOIN tbl_activity a2 ON (s.activity2=a2.id) 
LEFT JOIN tbl_activity a3 ON (s.activity3=a3.id) 

我不能做同樣的事情在HQL。我應該映射三次「一對多」的活動領域嗎?

+0

您必須在tbl_suppliers中擁有tbl_activity_id。對? – RAS

+0

@RAS,他確實擁有它,但連接列的名稱是activity1,activity2和activity3。 –

回答

2

表可以如下映射:

@Entity 
@Table(name="tbl_activity") 
public class Activity { 
    @Id private Integer id; 

    private String description; 
    //getters, setters, etc. 
} 

@Entity 
@Table(name="tbl_suppliers") 
public class Supplier { 
    @Id private Integer id; 

    private String name; 

    @JoinColumn(name = "activity1") 
    @ManyToOne private Activity activity1; 

    @JoinColumn(name = "activity2") 
    @ManyToOne private Activity activity2; 

    @JoinColumn(name = "activity3") 
    @ManyToOne private Activity activity3; 
    //getters, setters, etc. 
} 

原始SQL查詢可以用以下JPQL來,然後表示:

SELECT s.id, 
     s.name, 
     activity1.description, 
     activity2.description, 
     activity3.description 
FROM Supplier s 
    LEFT OUTER JOIN s.activity1 activity1 
    LEFT OUTER JOIN s.activity2 activity2 
    LEFT OUTER JOIN s.activity3 activity3 

如果喜歡更面向對象的方法,你可以簡單地查詢供應商並通過getActivity1.getDescription()訪​​問描述。

+0

非常感謝!如果我使用上面的查詢,它會起作用。如果我只是從供應商處選擇,它不會提取3個活動......我應該在「多對一」標籤中設置「lazy = false」嗎? (我使用XML文件)。我也非常感謝我的文章的格式。 –