我有这个问题:
两张表:
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
的记录name
,activity1
,activity2
,activity3
。
在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 :(得分: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()查询供应商和访问描述。