【问题标题】:querydsl how to return dto list?querydsl如何返回dto列表?
【发布时间】:2021-05-27 17:19:45
【问题描述】:

我使用 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、...但不工作 我该怎么办?

【问题讨论】:

    标签: java hibernate querydsl


    【解决方案1】:

    多级聚合当前为not supported by 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 的贡献者。

    【讨论】:

      猜你喜欢
      • 2019-10-04
      • 2019-01-28
      • 1970-01-01
      • 2023-02-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-02
      • 2018-01-11
      相关资源
      最近更新 更多