Почему @Formula возвращает нулевое значение - PullRequest
1 голос
/ 14 января 2020

У меня есть этот код. Я должен сделать уникальный номер поля с автоматическим приращением. Этот код ничего мне не дает. Когда я пытался сделать персистирование в отладке, он выдает мне значение null в поле number. Я попытался выполнить это в инструменте запроса к базе данных, все работает нормально. Что не так?

Моя целевая сущность:

@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;
}

Я опустил сеттеры, геттеры и конструкторы.

1 Ответ

0 голосов
/ 25 января 2020

Это выглядит как 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 использование - это встраивание в сущность данных, рассчитанных на основе других столбцов сущности с использованием функций базы данных, определенных c. И вам следует помнить, что использование оператора select в @Formula может привести к значительному снижению производительности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...