【问题标题】:How in JPA mappe into one column values of two other columns?如何在 JPA 中映射到其他两列的一列值?
【发布时间】:2021-07-11 13:35:42
【问题描述】:

我正在使用 JPA,在我的数据库中我有一个表 student,其中包含以下列:id、firstname 和 firstAndLastname

所以我做了一个Entity 来映射数据,我可以从另一个表中获取lastname,但我没有持久化它,因为数据库中没有lastname 列。

如何在firstAndLastname 列中存储名字和姓氏的串联并将其存储在特定列中,例如:名字:John,姓氏:Doe => firstAndLastname:JohnDoe

@Entity
@Table(name = "student")
public class Student implements Serializable {

@Id
@Column(name = "id")
private Integer id;

@Column(name = "firstname")
private String firstname;

@Transient
private String lastname;

@Column(name = "firstAndLastname")
private String firstLastname;

我试过这个(但不工作):

public String getFirstLastname() {
    return this.firstname+ this.lastname;
}

有什么想法吗?

【问题讨论】:

  • 数据库中有firstAndLastname 列吗?
  • 是的@code_mechanic 我有它
  • 那里保存了什么?
  • 它应该包含名和姓的串联
  • 如果你在那里保存价值,那你为什么要在 getter 中通过串联来获得它?

标签: java jpa entity


【解决方案1】:

如果您还没有弄清楚如何将数据持久化到数据库中,那么您需要从这里开始。您不会在 JPA 本身中保留数据,这只是对象的结构。您将在另一个类中构建 Student 对象的实例,设置值并将其持久化到数据库中。

您可以在创建学生实例的位置/时间设置 firstLastName 值。

这只是一个粗略的解释。不是你的明确代码。 你会有这样的课程:

public class SaveStudentService {
    public saveStudent(){
        Student student = new Student();
        student.setFirstName("test");
        student.setLastName("lastTest");
        student.setFirstLast(student.getFirstName + " "+ student.getLastName);
        
        studentRepo.save(student);
    }
}

Student 类中会有普通的 getter 和 setter...

public Student getfirstName() {return this.firstName;}
public Student setfirstName(String firstName) {return this.firstName = firstName;}

public Student getfirstLast() {return this.firstLastName;}
public Student setfirstName(String firstLastName) {return this.firstLastName = firstLastName;}

【讨论】:

    【解决方案2】:
    1. 为实体的所有属性生成 getter/setter。
    2. 实例化要保存的对象:Student student = new Student(1,"Mario","Rossi");
    3. 调用设置器:student.setFirstLastName(student.getFirstName()+student.getLastName());
    4. myStudentService.save(student);

    【讨论】:

      【解决方案3】:

      我会推荐两种方法:

      1. 如果通过构造函数实例化对象:
      public Student(final Integer id, final String firstname, final String lastname) {
          this.id = id;
          this.firstname = firstname;
          this.lastname = lastname;
          this.firstLastname = String.join(firstname, lastname);
      }
      
      1. 由二传手:
      public void setFirstLastname(final String firstName, final String lastName) {
          this.firstLastname = String.join(firstName, lastName);
      }
      
      1. 此外,您还可以在您的存储库上使用 Spring AOP 和建议 save 方法,但它的可读性较低且更难维护。
      @Before("execution(* com.package.StudentRepository.save(..))")
      public void updateFirstLastName(final JoinPoint joinPoint) {
          final Object[] arguments = joinPoint.getArgs();
          // find Student.class object and update firstLastName field
      }
      

      无论哪种方式 - 不要在 Student 类之外执行连接,因为它会导致样板文件并且更难维护。 但恕我直言,最好的方法是将firstNamelastName 分别存储在数据库中,并在需要时使用SQL CONCAT 函数。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-08-15
        • 2023-02-10
        • 1970-01-01
        • 2022-11-21
        • 2021-07-26
        • 1970-01-01
        • 2020-07-12
        • 1970-01-01
        相关资源
        最近更新 更多