繁体   English   中英

JAVA HIbernate 4.2.4:在不使用 HQL 的情况下向 3 个加入的实体添加额外的休眠条件(AND 条件)

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM