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,...但不起作用 我该怎么办?

解决方法

多级聚合目前为 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 的贡献者。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...