[英]JAVA HIbernate 4.2.4: Add additional hibernate criteria (AND condition) to 3 joined entities without using HQL
我正在尝试使用休眠条件加入 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 个类的片段:
@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"
}
}
}
]
}
请指教。
您可以在FluentJPA 中执行此操作,返回 Employee 并将其序列化为 JSON。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.