Java Spring Получить элемент по идентификатору пользователя

У меня есть 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);
}

Поначалу это может быть немного запутанным. Но ваша проблема связана с Hibernate (или любой другой реализацией ORM, которую вы используете), а не с Spring (данные Spring). Чтобы получить более качественную помощь, я рекомендую вам улучшить свой вопрос, указав весь связанный код (финансовые и пользовательские объекты), комментируя ошибки или «неожиданные» результаты и т. д. Надеюсь, это поможет!

Leo Tapia 29.04.2024 01:22
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
1
75
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы можете изменить объект, как показано ниже

Сущность

@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 должно быть достаточно. Зачем нам нужно добавлять пользовательское поле?

Alexander 29.04.2024 10:30

Вам следует предпочесть, какой тип отношений вы предпочитаете: таблица или сущность.

Если вы выберете связь между таблицами, ваш код должен быть таким.

Сущность

@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 при добавлении новых финансов в сущность «Пользователь».

Другие вопросы по теме