У меня есть API в JavaSpring, и я хочу знать, как я могу получить все «Финансы» по идентификатору пользователя, но я застрял на этом, и я хочу отправить тело в API, который отправляет UserId и получить все финансы, соответствующие пользователю.
@Entity
@Table(name = "finance")
public class Finance {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
@ManyToOne
@JoinColumn(name = "user_id", nullable = false)
private User user;
@Column(nullable = false)
private String title;
private String description;
@Column(nullable = false)
private String date;
@Column(nullable = false)
private Integer value;
Мой код сейчас такой, и я понятия не имею, что делаю. Я пытаюсь создать репозиторий, просто чтобы узнать, что я не знаю, что делать.
Услуга:
public ResponseEntity<Object> GetFinanceByUserId(Integer userId) {
List<Finance> userFinances = financeRepository.findByUserId(userId);
return new ResponseEntity<>(userFinances, HttpStatus.OK);
}
Репозиторий:
public interface FinanceRepository extends JpaRepository<Finance, Integer> {
List<Finance> findByUserId(Integer userId);
}
Вы можете изменить объект, как показано ниже
Сущность
@Column(name = "user_id", nullable = false)
private Long userId;
@ManyToOne(fetch = FetchType.LAZY, optional=false)
@JoinColumn(name = "user_id", insertable = false, updatable = false, nullable = false)
private User user;
Репозиторий
public interface FinanceRepository extends JpaRepository<Finance, Integer> {
List<Finance> findByUserId(Integer userId);
}
Добавления длинного поля userId должно быть достаточно. Зачем нам нужно добавлять пользовательское поле?
Вам следует предпочесть, какой тип отношений вы предпочитаете: таблица или сущность.
Если вы выберете связь между таблицами, ваш код должен быть таким.
Сущность
@Column(name = "user_id", nullable = false)
private Long userId;
Метод репозитория
Set<Finance> findByUserId(Integer userId);
Когда вы выбираете отношения сущностей, ваш код должен быть таким
Сущность
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "user_id")
private User user;
Метод репозитория
Set<Finance> findAllByUser(User user);
В этом случае вам не нужно создавать всего пользователя, вам нужно определить только поле идентификатора.
User user = User()
user.id = 1L
Set<Finance> finances = repository.findAllByUser(user)
Вы не можете смешивать оба варианта, потому что это может привести к ошибке: "Column 'person_id' is duplicated in mapping for entity $entityName$ (use '@Column(insertable=false, updatable=false)' when mapping multiple properties to the same column"
.
Конечно, вы можете добавить эти параметры для вставки и обновления. Но это приводит к новой ошибке, когда вы пытаетесь управлять объектом двунаправленным способом. В этом случае, когда вы смешиваете оба типа управления, вам необходимо установить поле user_id при добавлении новых финансов в сущность «Пользователь».
Поначалу это может быть немного запутанным. Но ваша проблема связана с Hibernate (или любой другой реализацией ORM, которую вы используете), а не с Spring (данные Spring). Чтобы получить более качественную помощь, я рекомендую вам улучшить свой вопрос, указав весь связанный код (финансовые и пользовательские объекты), комментируя ошибки или «неожиданные» результаты и т. д. Надеюсь, это поможет!