首页 > 解决方案 > querydsl如何返回dto列表?

问题描述

我使用querydsl,休眠我想在Dto列表中通过Dto选择数据但不工作

这是我的代码

@Data
@Entity
public class Team {

  @Id
  @GeneratedValue
  private Long id;

  private String name;

  @OneToMany(mappedBy = "team")
  private List<Member> members = new ArrayList<>();
}

@Entity
@Setter
public class Member {

  @Id
  @GeneratedValue
  private Long id;

  private String name;

  @ManyToOne
  @JoinColumn(name = "team_id")
  private Team team;

}
@Setter
public class TeamDto {

  private Long id;

  private String name;

  private List<MemberDto> members = new ArrayList<>();
}


@Setter
public class MemberDto {

  private Long id;

  private String name;
}

测试

  @BeforeEach
  void setup() {
    queryFactory = new JPAQueryFactory(em);

    Team team = new Team();
    team.setName("teamA");
    em.persist(team);

    Member member = new Member("memberA");
    member.setTeam(team);
    em.persist(member);

    Member member2 = new Member("memberB");
    member2.setTeam(team);
    em.persist(member2);

    em.flush();
    em.clear();
  }

  @Test
  void t1() {
    TeamDto teamDto = queryFactory
        .select(Projections.fields(
            TeamDto.class,
            team.id,
            team.name,
            Projections.fields(
                MemberDto.class,
                member.id,
                member.name
            ).as("members")
        ))
        .from(team)
        .fetchOne();
    System.out.println("teamDto = " + teamDto);
  }

错误日志为 = java.lang.IllegalArgumentException:com.blog.querydsltest.domain.dto.MemberDto 与 java.util.List 不兼容

什么问题??不可能通过 List dto 带来数据??我尝试将 Projections.fields 更改为 bean、construct、...但不工作我该怎么办?

标签: javahibernatequerydsl

解决方案


QueryDSL当前不支持多级聚合。目前也没有具体的计划来支持它。

对于可以获取关联的 DTO 解决方案,我建议您查看Blaze-Persistence Entity Views。使用实体视图,您的 DTO 的代码将如下所示:

@EntityView(Team.class)
public interface TeamDto {

   @IdMapping public Long getId();
   @Mapping("name") public String getName();
   @Mapping("members") public List<MemberDTO> getMembers();

}

如果members不是您的关联TeamEntity,您可以通过@MappingCorrelated绑定对其进行映射。

免责声明:我是 Hibernate、QueryDSL 和 Blaze-Persistence 的贡献者。


推荐阅读