我有这个问题:
两个表:
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 中做同样的事情。我应该映射事件字段三次“一对多”吗?
最佳答案
表可以映射如下:
@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() 查询供应商并访问描述。
关于Hibernate - 连接同一张表三次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12155174/