Spring:如何从一个对象中提取数据并插入另一个对象

时间:2017-06-01 16:56:03

标签: java spring jpa spring-data-jpa

我目前有两个表:劳动力员工 Workforce 表是已提交简历以加入公司的所有潜在员工的集合。 员工表是劳动力表中实际雇佣过的人员的集合。

环境: 1. Eclipse 2. Java(J2EE) 3. Maven 春天 5. JPA(JpaRepository)

为简洁起见,我将坚持使用这些数据提取和数据插入另一个表所关心的文件。

由于两个表的相似性,劳动力表中的许多字段与员工表中的字段类似:

  1. 名字
  2. 姓氏
  3. 电话号码 等...
  4. 如果选择了劳动力中的人员,则会有一个名为“isHired”的布尔值,其值为1.每周,劳动力表中的人员值为“1” “for”isHired“将从Workforce表中提取并插入Employees表。

    一般的SQL查询看起来像这样(并且在没有Spring HPQL约束的常规IDE中工作):

    INSERT INTO Employees (firstName, lastName, dept, phone) 
    SELECT emp_firstName, emp_lastName, emp_dept, emp_phone 
    FROM Workforce WHERE isHired = 1
    

    这很顺利,但我们谈论的是JPA,所以这就是我所做的:

    在存储库中,该过程分为两个部分:1)从一个表(Workforce)中提取数据,然后2)将提取的数据插入另一个表(Employees)

    WorkforceRepository.java

    package com.example.repository;
    
    import org.springframework.data.jpa.repository.JpaRepository;
    import org.springframework.data.jpa.repository.Query;
    import org.springframework.stereotype.Repository;
    
    import com.example.entities.Workforce;
    
    @Repository
    public interface WorkforceRepository extends JpaRepository<Workforce, Long> {
        @Query("SELECT new Workforce("
            + "w.workforceid, "
            + "w.firstName, "
            + "w.lastName, "
            + "w.dept, "
            + "w.phone) "
            + "FROM Workforce w WHERE isHired = 1")
        public List<Workforce> getNewHires();
    
    }
    

    Workforce.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 = "WORKFORCE")
    public class Workforce implements Serializable {
        private static final long serialVersionUID = 1L;
    
        public Workforce() {
        }
        public Workforce(long workforceid, String firstName, lastName, dept, phone) {
        this.workforceid = workforceid;
        this.firstName = firstName;
        this.lastName = lastName;
        this.dept = dept;
        this.phone = phone;
        }
        @Id
        @GeneratedValue(strategy=GenerationType.IDENTITY)
        @Column(name="workforceid")
        private long workforceid;
    
        @Column(name="firstName)
        private String firstName;
        // OTHER DECLARATIONS REMOVED FOR BREVITY
        // GETTERS AND SETTERS REMOVED FOR BREVITY
    }
    

    注意:我遗漏了Employee.java和EmployeesRepository.java以获得BREVITY 它们几乎相同,除了 employeeid 之外,这是主键对于Employee表,其他列完全相同。 contructor类只包含四个相同的列。

    我有大量的CRUD操作可以工作,而操作只发生在同一个表中。但是,我想这样做:

    EmployeesController.java

    // IMPORTS REMOVED FOR BREVITY
    List<Workforce> retrievedRisks = Workforce.getNewHires();
    for (Workforce w: retrievedRisks)
        Employees.saveAndFlush(w);
    // MISC CODE REMOVED FOR BREVITY
    

    我收到的错误当然如下:

    Type mismatch: cannot convert from element type Workforce to Employees
    

    任何人都知道如何从一个POJO对象中提取数据并使用JpaRepository将其插入到另一个POJO对象中?

1 个答案:

答案 0 :(得分:1)

如果Employees和Workforce相同,则可以使用hibernate继承。添加复制构造函数并重新保存实体。但是如果您有不同的约束或id生成器可能没有帮助(当员工已经存在Workforce ID时可能就是这种情况)。 简单来说,它只是从Workforce创建员工并通过

保存创建的对象
employee = new Employees(w.firstName, w.lastName, w.dept, w.phone);
Employees.saveAndFlush(employee);

在这种情况下,您创建新的Employees并且存储库将其保存正确。也许在保存新员工(劳动力副本)后,您应该删除旧的劳动力