gpt4 book ai didi

java - 如何将存储过程的结果映射到 spring-boot/hibernate 中的实体

转载 作者:行者123 更新时间:2023-12-02 00:31:05 25 4
gpt4 key购买 nike

我有一个实体类,如下所示

注意:checkNumber 是唯一的。

package tz.go.ega.biometic.entity;


import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.List;

import javax.persistence.*;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Pattern;

import lombok.ToString;
import org.hibernate.annotations.NaturalId;
import org.hibernate.validator.constraints.SafeHtml;
import org.springframework.data.annotation.Transient;
import org.springframework.format.annotation.DateTimeFormat;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Entity
@Table(name = "employee", uniqueConstraints = {
@UniqueConstraint(columnNames = {"check_number"})
})
@Data
@AllArgsConstructor
@ToString
@NoArgsConstructor
public class Employee implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "id")
private Long id;

@Basic(optional = true)
//@NotEmpty(message = "Please enter first name")
@Column(name = "first_name")
private String firstName;

@Basic(optional = true)
//@NotEmpty(message = "Please enter middle name")
@Column(name = "middle_name")
private String middleName;

@Basic(optional = true)
//@NotEmpty(message = "Please enter last name")
@Column(name = "last_name")
private String lastName;

private String status;

@Basic(optional = true)
// @Pattern(regexp ="^[a-zA-Z0-9_]*$",message = "{field.validation.voteCode}")
// @SafeHtml(message = "{field.validation.voteCode}")
@Column(name = "vote_code", length = 50)
private String voteCode;

@NaturalId
@Basic(optional = true)
//@NotNull(message = "Please enter check number")
@Column(name = "check_number")
private long checkNumber;

private Boolean isActive = true;


@Basic(optional = false)
@Column(name = "created_at", updatable = false)
@DateTimeFormat(pattern = "yyyy-MM-dd hh:mm:ss")
private LocalDateTime createdAt = LocalDateTime.now();

@Column(name = "updated_at")
@DateTimeFormat(pattern = "yyyy-MM-dd hh:mm:ss")
private LocalDateTime updatedAt = LocalDateTime.now();


@Column(name = "email")
private String email;
}

然后,我有一个存储过程来计算每个员工的工作时间,然后返回结果,如下所示。

+--------------+-------+
| checkNumber | Time |
+--------------+-------+
| 1122334455 | 29893 |
| 1234567890 | 15427 |
| 2233445566 | 19745 |
| 6655443322 | 12578 |
+--------------+-------+

我想要实现的目标是将存储过程的结果(如上所示)映射到实体(我们称之为 EmployeeWorkHours ),然后在该实体和实体之间创建关系使用 checkNumber 的员工实体。

我希望 EmployeeWorkHours 对象能够像正常的 hibernate 关系一样直接引用它的员工。

我该如何解决这个问题,任何帮助将不胜感激。谢谢。

最佳答案

在您的 EmployeeWorkHours 实体上,您需要与 Employee 实体建立 OneToOne 关系

@OneToOne(optional = false, fetch = FetchType.EAGER)
@JoinColumn(name = "checkNumber", unique = true, nullable = false)
private Employee employee;

在您的存储库中,您可以编写如下 SQL 查询:

@Query(value = "{CALL yourStoredProcedure (:var1, :var2, ..., :varn)}", nativeQuery = true)
int getWorkHours(@Param("var1") String var1, @Param("var2") String var2,...,
@Param("varn") String varn);

然后在您的服务层中,您只需调用此方法即可执行您想要的其他操作并保留它。希望对您有帮助

关于java - 如何将存储过程的结果映射到 spring-boot/hibernate 中的实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58016402/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com