@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 шт):

Автор решения: Oleg Marchenko
@OneToMany(mappedBy = "item_id", fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@Where(clause = "likeType = 'POST'")
public List<Like> getPostLikes() {
    return ...
}
→ Ссылка