Итак, предыстория этой проблемы: я создал календарь событий, который позволяет событиям охватывать несколько дней. В моей БД у меня есть таблица для события, и у меня есть таблица с именем event_dates, которая представляет собой просто event_id и дату.
Чтобы правильно получить строки с датами событий, я делаю INNER JOIN on EVENT_DATES (event_id)
Возврат из базы данных правильный, строка содержит всю информацию о событии вместе со столбцом «дата», прикрепленным в конце.
Мой домен для класса событий:
@Data
@Entity
@Table(name = "events")
@SecondaryTable(name = "event_date", pkJoinColumns=@PrimaryKeyJoinColumn(name = "event_id", referencedColumnName = "event_id"))
@RequiredArgsConstructor
public class Event {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "event_id")
private Long id;
private String eventTitle;
private String eventCategory;
private String eventType;
@Column(table = "event_date", name = "date", columnDefinition = "DATE", unique=true)
private LocalDate date;
@Column(table = "event_date", name = "event_date_id")
private Long eventDateId;
private boolean allDayEvent;
@Column(name = "start_time", columnDefinition = "TIME")
private LocalTime startTime;
@Column(name = "end_time", columnDefinition = "TIME")
private LocalTime endTime;
private String timezone;
private boolean onlineEvent;
private String city;
private String state;
private String country;
private String language;
private String description;
private boolean register;
private String registrationLink;
private boolean multiDay;
}
Вот где возникает проблема:
Пока db возвращает каждую строку вместе с правильными датами (без повторяющихся дней),
Spring data создает первую строку как объект с первой датой, но затем, когда он попадает в следующую строку, он видит, что идентификатор для события такой же, как у предыдущей сущности, и просто копирует эту сущность снова в массив, он никогда не проверяет, уникальна ли дата для этого объекта. Даты никогда не меняются, и важно, чтобы это происходило или мой api возвращал события, происходящие снова и снова в один и тот же день (правильное количество дубликатов, однако, ха-ха).
Таким образом, возвращаемое значение из spring - это правильное количество записей, но даты для каждой сущности остаются прежними, потому что не проверяется, что поля event_id и date уникальны для каждой сущности, добавляемой в массив возвращаемых результатов.
Я видел использование @UniqueConstraint, но проблема в том, что @UniqueConstraint охватывают две таблицы, а не одну и ту же таблицу, и я не нашел никаких примеров, показывающих, как настроить для этого типа ситуации.
Я там как 95%, мне просто нужно, чтобы даты для каждой сущности были уникальными!
обновлено, чтобы включить полное событие
В этом нет никакого смысла. Мне кажется, что у вас есть событие, а у события есть набор дат. Вам нужно прочитать об отношениях JPA.
клиент хочет, чтобы список дней перебирался. не список событий с несколькими датами в коллекции. вот почему я должен сделать это так.
Либо событие имеет коллекция дат, либо событие имеет составной ключ JPA, состоящий из идентификатора и даты. Вам нужно взглянуть на основы.
ага, так что я могу просто создать составной ключ. это имеет смысл.
Составные ключи @AddisonJoseph не являются хорошей практикой, и их следует избегать. Я предлагаю вам взглянуть на автоинкрементные идентификаторы или автоматически сгенерированные технические идентификаторы.




Покажите код
Eventполностью.