当前位置: 首页 > 知识库问答 >
问题:

Mapstruct映射多对一空结果

王嘉木
2023-03-14

Mapstruct在Spring-Boot rest api中使用一对多和多对一关系映射我的实体时遇到了一个问题。

我有下面的课

Policy.class

@Data
@Entity
@Table(name = "Policy")
public class Policy implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @Column(name = "Policy_UID", nullable = false)
    private Integer policyUid;

    //other fields without relationships

    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "userID", referencedColumnName = "Id")
    private User user;
}


User.class

@Data
@Entity
@Table(name = "User")
public class User implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @Column(name = "Id")
    private Integer id;

    //other fields without relationships

    @OneToMany(mappedBy = "user")
    @JsonIgnore
    public List<Policy> policyList;
}



PolicyDTO.class

@Data
@AllArgsConstructor
@NoArgsConstructor
public class PolicyDTO {

    private Integer policyUid;

    //other fields without relationships

    private UserDTO user;
}

UserDTO.class

@Data
@AllArgsConstructor
@NoArgsConstructor
public class UserDTO {

    private Integer id;

    //other fields without relationships

    public List<PolicyDTO> policyList;
}


PolicyMapper.class

@Mapper (componentModel = "spring")
public interface PolicyMapper {
    PolicyDTO policytoPolicyDTO(Policy policy);
    List<PolicyDTO> toPolicyListDTO(List<Policy> policies);
}

UserMapper.class

@Mapper(componentModel = "spring")
public interface UserMapper {
    UserDTO toUserDTO(User user);
    List<UserDTO> toUserListDTO(List<User> UsersList);
}

and the calling for results

List<PolicyDTO> list = policyMapper.toPolicyListDTO(paging.getContent());
return new PageImpl<>(list, page, paging.getTotalElements());

因此,当我在评论中添加私有UserDTO用户时;进入PolicyDTO和公共列表PolicyList;进入UserDTO

结果策略列出了所有字段中的值都可以,当然,除了两个注释字段。如果我用双向关系将这两个字段取消注释到DTO中,结果不仅在关系字段中是null,而且在所有字段中都是null。所有字段都是空的,就像所有行为都没有结果一样。

共有1个答案

莫振
2023-03-14

首先,尝试使用MapStruct版本

<mapstruct.version>1.3.1.Final</mapstruct.version>

要用spring实现MapStruct,您应该创建一个接口EntityMapper,其中包含两个泛型参数 ,并编写以下方法:

public interface EntityMapper <D, E> {

    public E toEntity(D dto);

    public D toDto(E entity);

    public List<E> toEntity(List<D> dtoList);

    public List <D> toDto(List<E> entityList);
}

并创建自己的实体接口

@Mapper(componentModel = "spring", uses = {})
public interface PolicyMapper extends EntityMapper<PolicyDTO, Policy> {
    PolicyDTO toDto(Policy policy);

    Policy toEntity(PolicyDTO policyDTO);

    default Policy fromId(Long id) {
        if (id == null) {
            return null;
        }
        Policy policy = new Policy();
        policy.setId(id);
        return policy;
    }
}

@Mapper(componentModel = "spring", uses = {})
public interface UserMapper extends EntityMapper<UserDTO, User> {
    UserDTO toDto(User user);

    User toEntity(UserDTO userDTO);

    default User fromId(Long id) {
        if (id == null) {
            return null;
        }
        User user = new User();
        user.setId(id);
        return user;
    }
}

您不需要定义一个方法来呈现列表,这是MapStruct的一个功能,可以映射实体中的所有字段,您只需要toDto,toEntity,就可以了。

我希望这对你有帮助;)

 类似资料:
  • 我有一个关于mapstruct中@ManyToOne映射的问题。我有两个表 第一个: 第二个是: 我有一个这样的箱子: 和MemberDto作为实体相同。 我需要使用mapstruct进行如下映射: 我需要填写名单成员;但我不明白怎么做。

  • 我试图使用MapStruct在dto和实体对象之间映射convert,但是生成的映射器实现只返回空的映射对象。 BeermapperImpl 任何人都可以提供我的代码可能出错的地方?谢谢!

  • 假设我需要将两个对象映射成一个或一个对象映射成一个(重载)。我可以通过以下映射来实现: 是否有一种方法可以更改第二个映射器“先做第一个映射器”,然后应用的附加映射?

  • 有两张数据表,其中A表的某个字段的值指向B表的主键。因为B表的任何一条记录理论上可以对应A表的多条记录,所以称这种 映射为B表对A表数据的一对多映射。 上述结构,如果用 POJO 来表示的话,可以参看下图: 如上图,一个 Master 自然就能对应多个 Pet ,所以, Master.pets (一个 List<Pet>) 就可以指向多个 Pet 对象, 那么我们说 Master.pets 就是

  • 主要内容:@ManyToOne 示例,程序输出结果多对一映射表示实体集合可以与相似实体关联的单值关联。 因此,在关系数据库中,实体的多于一行可以引用另一个实体的相似行。 完整的项目目录结构如下所示 - @ManyToOne 示例 在这个例子中,我们将创建一个学生和图书库之间的多对一关系,多个学生可以发布同一本书。 这个例子包含以下步骤 - 第1步: 在包中创建一个实体类,包含学生ID(s_id)和学生姓名(s_name),其中包含一个包含库类型对

  • 主要内容:@OneToMany 示例,程序输出结果一对多映射进入集合值关联的类别,其中实体与其他实体的集合关联。 因此,在这种类型的关联中,一个实体的实例可以映射到另一个实体的任意数量的实例。 完整的项目目录结构如下所示 - @OneToMany 示例 在这个例子中,我们将创建一个学生和图书库之间的一对多系,这样一个学生能发放多种类型的图书。 这个例子包含以下步骤 - 第1步: 在包下创建一个实体类,它包含学生ID(s_id),学生姓名(s_na