java - 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、...但不工作我该怎么办?
解决方案
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 的贡献者。
推荐阅读
- angular - Angular 6 Form Array 无法在 ng-container 中访问
- vb.net - 赋予对象透明度但仍然难以处理(因此可以看到它下面的其他对象)
- php - 一次提交插入多行时如何找出数据库中是否存在行
- excel - MacOS excel的这段代码相当于什么?
- laravel - 带有条件的laravel分页
- excel - 如何从 excel 表或其他文件创建黄瓜特征文件
- python - 有限制的长度为 L 的子序列的最大和
- python - 如何获取列名
- python - 致命的 Python 错误:运行我自己的语音助手程序时出现分段错误
- android - 在 AAR 文件创建 Android 时正在修改代码