我的DTO结构如下:
public class ADto{
private String name;
private String id;
private List<BDto> bdtos;
//Created constructor using fields
}
public class BDto{
private String id;
private String code;
private List<CDto> cdtos;
//Created constructor using fields
}
public class CDto{
private String mKey;
private String mVal;
//Created constructor using fields
}
使用Spring MVC获取数据。
以下查询工作正常并绑定数据:
@org.springframework.data.jpa.repository.Query("select new pkg.ADto(id,name) from AEntity a where a.id=?1")
public ADto getAData(Long id);
如何使用上述方法获取列表的数据,而该列表又由更多列表组成?
答案 0 :(得分:1)
如果要在enitites上返回DTO,则需要在DTO和实体之间提供映射。使用JPQL查询时,唯一的选择是在结果对象的构造函数中提供该映射。因此,您需要向ADto添加构造函数,ADto接受BEntities,并将所有嵌套实体映射到该构造函数中的dtos。或者以更面向对象的方式,新构造函数将接受AEntity作为唯一的参数。
这就是它的样子:
存储库中的getAData()方法(通过向结果添加a.bEntities稍微修改了JPQL):
@org.springframework.data.jpa.repository.Query("select new pkg.ADto(id,name, a.bEntities) from AEntity a where a.id=?1")
public ADto getAData(Long id);
ADto中的新构造函数:
public class ADto{
private String name;
private String id;
private List<BDto> bdtos;
public ADto(String id, String name, List<BEntity> bEntities) {
this.id = id; this.name = name;
this.bdtos = new ArrayList<>();
for (BEntity b : bEntities) {
BDto bdto = new BDto(b.id, b.code, b.cEntities);
/* you need to pass cEntities and map them again in the BDto
* constructor, or you may do the apping in ADto constructor
* and only pass mapped values to BDto constructor */
}
}
}
答案 1 :(得分:0)
你必须启用eager fetch:
@OneToMany(mappedBy = "adto", fetch = FetchType.EAGER)
private List<BDto> bdtos;
然后你可以像这样获取它,即:
ADto findById(Long id); // literally!