如何使用 @ElementCollection 进行 Set<Integer> 映射?

How to use @ElementCollection for Set<Integer> mapping?

我有2张桌子。 report_id是PK。 animals_in_area 没有 PK 密钥。

我需要根据给定的 report_idreport_date 检查 animal_report 中的 animal_id。 这似乎是一项简单的任务,但我能否以某种方式描述 animal_report class 中的字段 Set<Integer> adimalIds,映射到请求的区域? 我尝试了 @ElementCollection + @CollectionTable,但由于 @Id 注释,它会自动将 report_id 映射到 area_id

@ElementCollection
@CollectionTable(name = "animals_in_area", joinColumns = @JoinColumn(name = "area_id"))
@Column(name = "animal_id")
private Set<Integer> adimalIds = new HashSet<>();

我想在 DTO 中使用 criteriaBuilder.isMember(animalIdRequest, adimalIds)

什么是 classic 方式?加入并获得 Set ?

               animal_report                                 animals_in_area
    ---------------------------------                      -------------------
    report_id | report_date | area_id                      area_id | animal_id  
    ---------------------------------                      -------------------
        1     |  01.01.2020 |  100                           100   |   1001
        2     |  01.01.2020 |  101                           100   |   1002
                                                             100   |   1003
                   .....                                     101   |   1002
                                                             101   |   1004

@Entity
@Table(name = "animal_report")
public class AnimalReport implements Serializable {

  @Id
  @Column(name = "report_id")
  private Long reportId;

  @Column(name = "report_date")
  private LocalDate reportDate;

  @Column(name = "area_id")
  private Integer areaId;
  ...
}

您应该按以下方式更正您的映射:

@Entity
@Table(name = "animal_report")
public class AnimalReport implements Serializable {

  @ElementCollection
  @CollectionTable(name = "animals_in_area", joinColumns = @JoinColumn(name = "area_id", referencedColumnName = "area_id"))
  @Column(name = "animal_id")
  private Set<Integer> animalIds = new HashSet<>();

  // ...
}

您必须使用 referencedColumnName 因为 animals_in_area.area_id 列引用的不是 animal_report table.

的主键列