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

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

长孙知
2023-03-14

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

环境:1。Eclipse 2。Java(J2EE)3。Maven 4。Spring5。JPA(JpaRepository)

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

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

  1. 名字
  2. 姓氏
  3. 部门
  4. 电话号码等

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

常规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)将提取的数据插入另一个表(员工)

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();

}

劳动力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
}

注:我遗漏了该员工。java和EmployeesRepository。java为简洁起见,它们几乎相同,除了employeeid(Employee表的主键)之外,其他列也完全相同。constructor类只包含同样的四列。

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

员工控制员。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对象提取数据并将其插入另一个POJO对象吗?

共有1个答案

涂选
2023-03-14

如果员工和劳动力几乎相同,则可以使用hibernate继承。添加复制构造函数和重新保存实体。但如果您有不同的约束条件或id生成器(可能是员工已经有工作人员id的情况),则可能没有帮助。简单的情况是,只需从劳动力中创建员工,并通过

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

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

 类似资料:
  • 我有以下数据结构: <代码>地图 我想从这个复杂的 Map 对象中提取它的值(它本身是另一个字符串 Map)。我目前正在这样做: 上面的实现给了我一个新的Map对象,由于外部循环,它正在迭代。似乎我错过了什么。 如何从复杂的 Map 对象中提取内部 Map 对象? 编辑: 回应AlexWien的评论 原始数据结构: 原始数据结构背后的原因是为一对id(ID1和ID2)存储一个值。ID1和ID2可以

  • 如何从事件处理程序中的对象打印多个键? 这里是链接到我的代码-https://codesandbox.io/s/suspicious-hamilton-erkqv 在第35行,我用对象“x”调用事件处理程序ChangeName。我可以打印一个名为“name”(x.name)的键。我如何打印x对象的所有3个道具(名称、id、类型)?? 尝试将x转换为object.keys(x)的数组,但当我循环通过

  • 问题内容: 我对Json文件很陌生。如果我有一个包含多个json对象的json文件,例如: 我想将所有“时间戳记”和“有用性”提取到一个数据帧中: 有谁知道解决此类问题的一般方法? 问题答案: 使用json数组,格式为: 然后将其导入到您的python代码中 现在,数据的内容是一个带有字典的数组,字典表示每个元素。 您可以轻松访问它,即:

  • 我正在使用Spring,但对它的所有功能并不熟悉。寻找将字段从一个Java对象实例复制到另一个对象实例的好方法。我已经看到了如何将属性从一个Java bean复制到另一个Java bean?但我要找的是更具体的,所以下面是详细信息: 假设我有两个类P的实例,源

  • 我有一个输入超文本标记语言表单,我插入如下值: 然后,即使插入表单的数据在另一个表中也有一个ID; 例如id of data1是1, id of data2是2,... 现在,我将它们的值形式如下: 所以我用“,”输入数据,然后我不能使用: > 如何插入从data1、data2、,。。。将MySQL数据库作为数组,如id1、id2、,。。。

  • 问题内容: 我需要将数据从一个数据库迁移到另一个数据库,两者都在同一本地系统上。 表和列的名称不同,我不能从旧数据库迁移所有列,因此 对我不起作用。 但我只有一个 我的查询中有什么错误,我该如何解决? 提前致谢 问题答案: 您的查询应如下所示: 更新 由于这个答案的关注程度超出了我的预期,因此我应该扩展这个答案。首先,从答案本身看可能并不明显,但各列不必具有相同的名称。因此,以下操作也将起作用(假