【问题标题】:JAVA HIbernate 4.2.4: Add additional hibernate criteria (AND condition) to 3 joined entities without using HQLJAVA HIbernate 4.2.4:在不使用 HQL 的情况下向 3 个连接实体添加额外的休眠条件(AND 条件)
【发布时间】: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


    【解决方案1】:

    您可以在FluentJPA 中执行此操作,返回 Employee 并将其序列化为 JSON。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-26
      • 2012-12-22
      • 1970-01-01
      • 2011-11-17
      相关资源
      最近更新 更多