【发布时间】:2019-12-22 23:41:25
【问题描述】:
我正在尝试使用休眠条件加入 3 个实体,其关系定义如下:
- 每个员工都有一个部门和一个专业。
- 一个部门可以有很多员工。
- 一个部门可能包含多个专业。
- 一个专业可以属于多个部门。
我想得到一个包含所有详细信息的员工 ID 的响应。这里的问题是 Employee 和 Specialization 实体之间没有直接的外键关系。因此我无法加入这两个实体。
下面是一些示例数据:
员工:
| emp_id | emp_name | emp_specialization | dept_id |
|:-------|---------:|:------------------:|--------:|
| 1 | John | electronics| 1|
| 2 | Wick | frame| 2|
| 3 | Three | radar| 1|
部门:
| dept_id | dept_name |
|:-------|-----------:|
| 1 | F21 Raptor |
| 2 | F35 Panther|
专业:
| spec_id | dept_id | spec_name |
|:-------|---------:|:------------------:|
| 1 | 1| electronics|
| 2 | 1| frame|
| 3 | 2| radar|
如给定的那样,emp_specialization 和 spec_name 定义了两个实体之间的关系 - Employee 和 Specialization。
以下是 3 个类的 sn-ps:
@Entity
@Table(name = "Employee")
Class Employee {
private Long emp_id;
private String emp_name;
private String emp_specialization;
@ManyToOne
@JoinColumn(name = "dept_id")
private Department department;
}
@Entity
@Table(name = "Department")
Class Department {
private Long deptId;
@OneToMany(mappedBy="dept_id", fetch=FetchType.EAGER)
private Set<Specialization> specialization;
}
@Entity
@Table(name = "Specialization")
Class Specialization {
private Long spec_id;
private Long dept_id;
private String spec_name;
}
Criteria criteria = session.createCriteria(Employee.class);
criteria.add(Restrictions.eq("emp_id", 1));
List<Employee> empList = criteria.list();
以上条件产生以下 SQL:
SELECT
Employee.*
FROM
Employee emp
LEFT OUTER JOIN
Department dpt
ON emp.dept_id = dpt.dept_id
LEFT OUTER JOIN
Specialization spec
ON dpt.dept_id = spec.dept_id
WHERE emp.emp_id = 1
但这会导致 ID=1 的 Employee 有多个专业化:
{
"Employee": [{
"emp_id": 1,
"emp_name": "John",
"emp_spec": "electronics",
"department": {
"dept_id": 1,
"dept_name": "F21 Raptor",
"specialization": [{
"spec_id": 1,
"spec_name" "electronics"
}, {
"spec_id": 2,
"spec_name" "frame"
}
]
}
}
]
}
我真正想要的是:
SELECT
Employee.*
FROM
Employee emp
LEFT OUTER JOIN
Department dpt
ON emp.dept_id = dpt.dept_id
LEFT OUTER JOIN
Specialization spec
ON dpt.dept_id = spec.dept_id
WHERE emp.emp_id = 1
AND emp.emp_specialization = spec.spec_name
并会以以下 JSON 格式给出响应:
{
"Employee": [{
"emp_id": 1,
"emp_name": "John",
"emp_spec": "electronics",
"department": {
"dept_id": 1,
"dept_name": "F21 Raptor",
"specialization": {
"spec_id": 1,
"spec_name" "electronics"
}
}
}
]
}
请指教。
【问题讨论】:
标签: java hibernate hibernate-mapping hibernate-criteria hibernate-onetomany