繁体   English   中英

春季:如何从一个对象提取数据并将其插入另一个对象

[英]Spring: How to Extract Data from One Object and Insert Into Another

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

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

为简便起见,我将坚持使用与提取数据并将数据插入另一个表相关的文件。

由于两个表的相似性, Workforce表中的许多字段将与Employees表中的字段相似:

  1. 名字
  2. 电话号码等...

如果员工的个人选择,有一个名为“isHired”一个布尔值,将有每周的1值,人在劳动力中的表的“1”为“isHired”将从提取的值劳动力表并插入到雇员表中。

常规的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();

}

劳动力

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表的主键)之外,其他列也完全相同。 构造器类仅包含四个相同的列。

我有大量的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

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

如果Employees和Workforce完全相同,则可以使用休眠继承。 添加复制构造函数并重新保存实体。但是,如果您具有不同的约束或id生成器(可能是Employees已经具有Workforce id的情况),这可能无济于事。 简单的例子就是从Workforce创建雇员并通过保存创建的对象

employee = new Employees(w.firstName, w.lastName, w.dept, w.phone);
Employees.saveAndFlush(employee);

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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