如何使用 @ElementCollection 进行 Set<Integer> 映射?
How to use @ElementCollection for Set<Integer> mapping?
我有2张桌子。 report_id
是PK。 animals_in_area
没有 PK 密钥。
我需要根据给定的 report_id
和 report_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.
的主键列
我有2张桌子。 report_id
是PK。 animals_in_area
没有 PK 密钥。
我需要根据给定的 report_id
和 report_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.