Hibernate - 连接三次相同的表

时间:2012-08-28 08:09:22

标签: hibernate join hql jpql

我有这个问题:

两张表

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

tbl_activity 
   id* (int), 
   description (string)

两个表之间存在一种“一对多”关系: tbl_activity(一) - > tbl_suppliers(很多);这意味着每个供应商都可以为每个活动填充所有三个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中做同样的事情。我应该将“一对多”活动字段三次映射?

1 个答案:

答案 0 :(得分:3)

表格可以如下映射:

@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()查询供应商和访问描述。