Как сопоставить модель пользователя внутри модели с помощью картографа?

Как сопоставить объект пользователя в моей модели UserRole с моделью пользователя?

Ролевая модель пользователя:

public class UserRole extends Base {
        @ManyToOne(fetch = FetchType.LAZY)
        @JoinColumn(name = "user_id"  ,referencedColumnName = "id")
        User user;
        @JoinColumn(name = "role_id"  ,referencedColumnName = "id")
        @ManyToOne(fetch = FetchType.LAZY)
        Role role;
        @Column(name  = "is_active")
        Boolean isActive;
}

Модель пользователя:

public class User extends Base {
    @Column(name = "name")
    String name;
    @Column(name = "surname")
    String surname;
    @Column(name = "email", unique = true)
    String email;
    @Column(name = "password")
    String password;
    @ManyToMany(fetch = FetchType.LAZY)
    @JoinTable(
            name = "user_role", 
            joinColumns = @JoinColumn(name = "user_id"), 
            inverseJoinColumns = @JoinColumn(name = "role_id") 
    )
    List<Role> roles;
    @Column(name = "status")
    @Enumerated(EnumType.STRING)
    Status status;
}

Я сделал это с помощью Mapper, но это не сработало

@Mapping(target = "id", source = "user.id")
    @Mapping(target = "name", source = "user.name")
    @Mapping(target = "surname", source = "user.surname")
    @Mapping(target = "email", source = "user.email")
    @Mapping(target = "roles", source = "user.roles")
    List<User> toDtoList(List<UserRole> userRoles);
  • Расширенная базовая модель содержит только столбцы id, Create_at и Updated_at.

Этот вопрос похож на: MapStruct: сопоставление исходного класса с объектом (с UUID поля) с целевым с UUID поля приводит к нулевому результату. Если вы считаете, что это другое, отредактируйте вопрос, поясните, чем он отличается и/или как ответы на этот вопрос не помогают решить вашу проблему.

Luca Basso Ricci 02.09.2024 08:45
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
1
53
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Я думаю, что используемый метод не совсем подходит для сопоставления списка UserRole со списком объектов User.

Аннотация @Mapping(target = "") используется для сопоставления отдельных объектов, а не коллекций. Итак, мы можем использовать приведенное ниже, чтобы решить проблему.

  1. Создайте метод (toUser), который сопоставляет UserRole с объектами User с индивидуальными сопоставлениями полей.
  2. Создайте еще один метод (toUserList) для обработки преобразования списка. Здесь MapStruct будет повторно использовать логику, присутствующую в методе toUser, для каждого элемента в списке.

Обновленный код,

@Mapping(target = "id", source = "user.id")
@Mapping(target = "name", source = "user.name")
@Mapping(target = "surname", source = "user.surname")
@Mapping(target = "email", source = "user.email")
@Mapping(target = "roles", source = "user.roles")
User toUser(UserRole userRole);

List<User> toUserList(List<UserRole> userRoles);

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