@OneToMany c дополнительным фильтром
Есть такая сущность лайков:
@Data
@Entity
@Table(name = "likes")
public class Like {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
@JsonBackReference
@ManyToOne(fetch = FetchType.LAZY, optional = false)
@JoinColumn(name = "person_id")
private Person person;
@Column(name = "item_id")
private long itemId;
@Enumerated(EnumType.STRING)
private LikeType likeType;
@CreationTimestamp
@Column(columnDefinition = "timestamp with time zone")
private LocalDateTime time;
public Like() {}
public Like(Person person, long itemId, LikeType likeType) {
this.person = person;
this.itemId = itemId;
this.likeType = likeType;
}
}
Лайки могут быть как для постов, так и для комментариев... хранятся в одной таблице с указанием типа..
Проблема в том, что для сущностей Post и Comment я не могу создать связь @OneToMany по двум столбцам сразу... мне то надо получить лайки по post.id, но с типом LikeType.POST
Вроде можно два столбца указать в @JoinColumn, но нельзя указать конкретного значения...
В общем самое тонкое место здесь:
@OneToMany(mappedBy = "item_id", fetch = FetchType.LAZY, cascade = CascadeType.ALL)
public List<Like> getPostLikes() {
return ...
}
Моя проблема бы решилась, если можно было бы написать что то типа mappedBy = "item_id and type='Post'" или бы если можно было бы указать какой-нибудь фильтр
Может быт можно как-то в конструкторе Поста и Коммента вызвать метод сервиса лайков, который уже предоставил бы нужный список?
Как быть?
Заранее, спасибо за помощь...
Ответы (1 шт):
@OneToMany(mappedBy = "item_id", fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@Where(clause = "likeType = 'POST'")
public List<Like> getPostLikes() {
return ...
}