从一个表中获取数据并插入到另一个表中JPA

问题描述 投票:0回答:1

我是JPA的初学者。根据需求,我试图从多个表(emp_boarding_details,amex_emp_detail,emp_offboarding_details)中获取数据并插入到另一个表即emp_boarding_history中。

1. EmpBoardingHistoryRepository.java。

public interface EmpBoardingHistoryRepository extends JpaRepository<EmpBoardingHistory, Long> {

@Query(nativeQuery = true, value = "SELECT new com.boarding.boardinghistory.resource.EmpBoardingHistory**(ebd.exemption_type_txt, ebd.exemption_remarks_txt, ebd.emp_no_int, ebd.first_name_txt, ebd.middle_name_txt, ebd.last_name_txt, ebd.email_id_txt, ebd.emp_or_contractor_ind, ebd.vendor_laptop_desktop_asset_txt, ebd.country_origin_txt, ebd.status_txt, aed.billing_po_no_txt, aed.contractor_id_txt, aed.contract_type_txt, aed.proj_master_cd_txt, aed.amex_email_id_txt, aed.amex_laptop_desktop_asset_id_txt, aed.ads_id_txt, aed.cost_center_txt, aed.contractor_id_creation_date, aed.first_billing_date, aed.clarity_resource_role_txt, aed.platform_id_txt, aed.premium_technology_txt, aed.resource_status_txt, aed.onboard_completion_date, eod.resource_leaving_date, eod.departure_date) FROM emp_boarding_details ebd, amex_emp_details aed, emp_offboarding_details eod WHERE ebd.emp_no_int = aed.emp_no_int AND aed.emp_no_int = eod.emp_no_int AND ebd.emp_no_int = :empNo")
    List<EmpBoardingHistory> getEmpBoardingDetails(@Param("empNo") long empNo); 
}

2. EmpBoardingHistory.java。

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

    public EmpBoardingHistory() {
        super();
    }

    public EmpBoardingHistory(String exemptionfromaxpreporting, String exemptionremarks,
            @NotNull(message = "Employee number is mandatory") @Range(min = 999, max = 999999999) int empno,
            String firstname, String middlename, String lastname, String emailid, String emporcontractor,
            String venderlaptopordesktopassetno, String countryoforigin, String status, String billponumber,
            String contractoridnumber, String contracttype, String projmastercd, String amexemailaddress,
            String amexlaptopordesktopassetnumber, String adsid, String costcenter, Date contractoridcreationdate,
            Date firstbillingdate, String clarityorresourcerole, String premiumtechnology, String resourcestatus,
            Date onboardCompletionDate, Date resourceleavingdate,
            @NotNull(message = "First Billing Date is mandatory") Date departuredate) {
        super();
        this.exemptionfromaxpreporting = exemptionfromaxpreporting;
        this.exemptionremarks = exemptionremarks;
.......

//For all setter and getter defined
}}

当我试图调用这个getEmpBoardingDetails()时,得到以下异常。

020-06-03 16:24:15.146 DEBUG 68096 --- [nio-8080-exec-5] org.hibernate.SQL                        : SELECT new com.boarding.boardinghistory.resource.EmpBoardingHistory(ebd.exemption_type_txt, ebd.exemption_remarks_txt, ebd.emp_no_int, ebd.first_name_txt, ebd.middle_name_txt, ebd.last_name_txt, ebd.email_id_txt, ebd.emp_or_contractor_ind, ebd.vendor_laptop_desktop_asset_txt, ebd.country_origin_txt, ebd.status_txt, aed.billing_po_no_txt, aed.contractor_id_txt, aed.contract_type_txt, aed.proj_master_cd_txt, aed.amex_email_id_txt, aed.amex_laptop_desktop_asset_id_txt, aed.ads_id_txt, aed.cost_center_txt, aed.contractor_id_creation_date, aed.first_billing_date, aed.clarity_resource_role_txt, aed.platform_id_txt, aed.premium_technology_txt, aed.resource_status_txt, aed.onboard_completion_date, eod.resource_leaving_date, eod.departure_date) FROM emp_boarding_details ebd, amex_emp_details aed, emp_offboarding_details eod WHERE ebd.emp_no_int = aed.emp_no_int AND aed.emp_no_int = eod.emp_no_int AND ebd.emp_no_int = ?
2020-06-03 16:24:15.149 TRACE 68096 --- [nio-8080-exec-5] o.h.type.descriptor.sql.BasicBinder      : binding parameter [1] as [BIGINT] - [909089]
2020-06-03 16:24:15.282  WARN 68096 --- [nio-8080-exec-5] o.h.engine.jdbc.spi.SqlExceptionHelper   : SQL Error: 1064, SQLState: 42000
2020-06-03 16:24:15.282 ERROR 68096 --- [nio-8080-exec-5] o.h.engine.jdbc.spi.SqlExceptionHelper   : You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '.boarding.boardinghistory.resource.EmpBoardingHistory(ebd.exemption_type_txt, eb' at line 1

继续上面的问题-> 现在我成功地从多个表中获取数据(感谢Jens!),但当我试图将响应保存到另一个表中,即emp_boarding_history时,数据没有持久化。

/检索和保存逻辑

public EmpBoardingHistory selectSaveEmpBoardingHistory(Integer empNo) { 
    //Retrieve Data FROM ONE TABLE 
    List<EmpBoardingHistory> empBoardingHistoryList = empBoardingHistoryRepository.findBoardingHistoryEmpNo(empNo); 
    EmpBoardingHistory empBoardingHistory = new EmpBoardingHistory(); 
    for (EmpBoardingHistory empBoardingHistoryObj : empBoardingHistoryList) 
    { 
    //SAVING DATA INTO ANOTHER TABLE 
    empBoardingHistoryRepository.save(empBoardingHistoryObj);
    empBoardingHistory = empBoardingHistoryObj; 
    } 
    return empBoardingHistory; 
    }
spring-boot hibernate jpa spring-data-jpa nhibernate-mapping
1个回答
1
投票

你在查询中使用了一个构造函数表达式。

new com.boarding.boardinghistory.resource.EmpBoardingHistory**(...

这是一个来自JPQL的构造。但你也把它标记为 nativeQuery = true 这意味着它被解释为SQL,而SQL没有这样的构造函数。使用构造函数表达式或者将其标记为本地查询,而不是两者兼而有之。

另外,构造函数表达式包含 ** 这将不会工作。

© www.soinside.com 2019 - 2024. All rights reserved.