当前位置: 首页 > 知识库问答 >
问题:

Spring/JPA/Hibernate如何在一个存储库中实现两个实体的连接

郎羽
2023-03-14
EMPLOYEE:
------------------------
emp_id (int, primary key)
emp_name (varchar(125))
emp_dept (foreign key)
emp_intro (text)

另一个表是Department表,包含以下列:

DEPARTMENT:
-----------
dept_id (int, primary key)
dept_label (varchar(25))

下面是表值的示例

DEPARTMENT:
------------------------
dept_id    | dept_label
------------------------
 1         | Sales
------------------------
 2         | Technology
------------------------
 3         | Finance

为了返回带有状态标签的员工信息,我们需要执行连接:

SELECT e, d.dept_label FROM employees JOIN department d ON d.dept_id = e.emp_dept
SELECT e.emp_id, e.emp_name, d.dept_label, e.emp_intro FROM employees e, department d WHERE e.emp_dept = d.dept_id

Employee.java

package com.example.entities;

import java.io.Serializable;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name = "employees")
public class Employee implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "emp_id")
    private long emp_id;

    @Column(name = "emp_name")
    private String emp_name;

    @Column(name = "emp_dept")
    private Integer emp_dept;

    @Column(name = "emp_intro")
    private String emp_intro;

    public long getEmp_id() {
        return emp_id;
    }

    public void setEmp_id(long emp_id) {
        this.emp_id = emp_id;
    }

    public String getEmp_name() {
        return emp_name;
    }

    public void setEmp_name(String emp_name) {
        this.emp_name = emp_name;
    }

    public Integer getEmp_dept() {
        return emp_dept;
    }

    public void setEmp_dept(Integer emp_dept) {
        this.emp_dept = emp_dept;
    }

    public String getEmp_intro() {
        return emp_intro;
    }

    public void setEmp_intro(String emp_intro) {
        this.emp_intro = emp_intro;
    }

    public static long getSerialversionuid() {
        return serialVersionUID;
    }

}

Department.java

package com.example.entities;

import java.io.Serializable;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name = "departments")
public class Department implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "dept_id")
    private long dept_id;

    @Column(name = "dept_label")
    private String dept_label;

    public long getDept_id() {
        return dept_id;
    }

    public void setDept_id(long dept_id) {
        this.dept_id = dept_id;
    }

    public String getDept_label() {
        return dept_label;
    }

    public void setDept_label(String dept_label) {
        this.dept_label = dept_label;
    }

    public static long getSerialversionuid() {
        return serialVersionUID;
    }

}

然后是存储库(DAO):

package com.example.repository;

import.java.util.List;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;

import com.example.entities.Employee;

public interface EmployeeRepository extends JpaRepository<Employee, Long> {

    @Query("select e, d.dept_label FROM Employee e JOIN Department d ON "
    + "d.dept_id = e.emp_id")
    public List<Employee> return getEmployees();

}
package com.example.controllers;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import com.example.entities.Department;
import com.example.entities.Employee;
import com.example.repository.EmployeeRepository;

@Controller
public class EmployeeController {

    @Autowired
    EmployeeRepository er;

    @RequestMapping(value = "/getEmployees")
    public @ResponseBody List<Employee> getEmployees() {
        return er.getEmployees();
    }

}

共有1个答案

笪涛
2023-03-14

您不必使用原始连接来完成此操作,只需使用适当的关系映射即可。employeedepartment之间的关系听起来类似于@manytoOne@manytomany。您将能够例如Employee.getDepartament()或通过Employee.Departament.name=:name进行查询

http://www.objectdb.com/api/java/jpa/manytomany

您甚至可以映射双向关系,这样您就可以获取员工的离职信息,以及给定离职信息中的所有员工

 类似资料:
  • 我正在努力使用jpa Crudepository接口连接两个实体模型。我不知道如何映射两个实体模型并在@query注释中编写查询。这些是我的实体类。我想执行这个查询“从taxi\u driver\u映射中选择dppd.payment\u plan\u id,dppd.attribute\u value,dppd.attribute\u id作为tdm加入driver\u payment\u pla

  • 另一个实体是: 我想编写一个接口,例如

  • AnsprechPartner Lieferant ansprechpartner.java lieferant.java 在我的AnsprechPartner.java中,我是这样做的: 在我的Lieferanten.java中,我是这样做的:

  • 问题内容: 我正在使用Spring + Hibernate+JPA,但遇到无法将实体持久保存到数据库的情况。我已经建立了一个带有@Transactional注释的服务类。它使用包含注入的EntityManager的DAO。当我在服务对象上调用函数时,我看到DAO正在进行大量的选择读取,但是由于我的DAO发出的合并和删除操作,没有更新/删除。当然,我的设置有问题,但是我看不到它。 persisten

  • 问题内容: 是否可以使用Spring Data Rest为同一JPA实体发布两个不同的存储库?我给两个存储库提供了不同的路径和rel-name,但是这两个存储库中只有一个可以用作REST端点。我拥有两个存储库的要点是,其中一个是摘录,仅显示实体的基本字段。 问题答案: 可怕的部分不仅是你只能有1个弹簧数据仓库休息(@RepositoryRestResource)每实体,但也说,如果你有一个普通JP