问题描述
我使用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 的贡献者。