首页 > 解决方案 > 为什么@Formula 返回空值

问题描述

我有这个代码。我必须使用自动增量创建一个唯一的字段编号。这段代码什么也没给我。当我试图坚持调试时,它给了我nullnumber字段中的价值。我尝试在数据库查询工具中执行此操作,一切正常。怎么了?

我的目标实体:

@Entity
@Table(schema = "public")
public class Policeman implements Serializable {

   @Id
   @GeneratedValue(strategy = GenerationType.IDENTITY)
   private Long id;

   @Column
   @Formula(value = "(select max(student_id) from student)")//+1
   private Long number;

   @Column
   private String fam;

   @Column
   private String name;

   @Column
   private String otch;
}

学生单位:

@Entity
@Table(name="student", schema = "public")
public class Student extends Human implements Serializable {

   @Id
   @Column(name="student_id")
   @GeneratedValue(strategy = GenerationType.SEQUENCE)
   private Long id;

   @ManyToOne(fetch = FetchType.EAGER,cascade = {CascadeType.PERSIST, CascadeType.MERGE, CascadeType.DETACH})
   @JoinColumn(name="fk_groups")
   private Group gruppa;
}

我省略了 setter、getter 和构造函数。

标签: javadatabasehibernatejpaentity

解决方案


它看起来像一个XY 问题

从技术上讲,您可以通过以下方式更正您的声明:

@Entity
@Table(schema = "public")
public class Policeman implements Serializable {
   // ...

   // Please pay attention that you should not use @Column annotation here.
   @Formula(value = "(select max(public.student.student_id) from public.student)")
   private Long number;

   // ...
}

它会返回你所期望的。

但是,您不应该将它用于您的问题中提到的目的:

我必须使用自动增量创建一个唯一的字段编号。

典型的@Formula用法是将基于实体的其他列计算的数据嵌入到实体中,并使用数据库特定的功能。您应该记住, usingselect语句@Formula会导致性能显着下降。


推荐阅读