JPA中的返回列表类型

时间:2015-09-25 14:14:16

标签: java spring jpa

我的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);

如何使用上述方法获取列表的数据,而该列表又由更多列表组成?

2 个答案:

答案 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!