在处理Spring Data JPA时如何使用特定字段类型的DTO强制转换Object []元素?

时间:2018-04-03 18:40:42

标签: jpa reflection spring-data-jpa jpql

我使用JPA Query获得了如下结果:

String query = "Select dataId, dataName, dataValue, datadesc From Data";
Query q = entityManager.createQuery(query).setMaxResults(10);
List<Object[]> dataList = q.getResultList();

请注意,我不想选择所有字段,例如“从数据d中选择d”。我将选择以下字段: “dataId,dataName”,“dataId,dataName,datadesc”

我需要遍历上面的dataList并根据字段类型对每个元素进行类型转换:

我的数据实体类如下:

public class Data{
  private Long permitId;
  private String permitNumber;
  private Date permitDate;
}

我按照以下方式进行了投射:

for (Object[] object : dataList) {
    Data d = new Data();
    d.setDataId((Long)object[0]);
    d.setDataName((String)object[1]);
    ...
}

但我想把这个演员视为动态:

for (Object[] object : dataList) {
    Data d = new Data();
    **for (Field field : Data.class.getDeclaredFields()) {
    if (field.getName().equals("dataId")) {
        d.setDataId(**(field.getType())**object[0]);
    }
    if (field.getName().equals("dataName")) {
        d.setDataName(**(field.getType())**object[1]);
    }**
    ...
}

无论如何要实现这个目标吗?

1 个答案:

答案 0 :(得分:0)

您可以创建DTO并在查询中使用它,例如:

String query = "Select new com.package.MyDto(dataId, dataName, dataValue, datadesc) From Data";
Query q = entityManager.createQuery(query).setMaxResults(10);
List<MyDto> dataList = q.getResultList();

MyDto课程:

class MyDto {

    // fields

    MyDto(Long dataId, String dataName, Long dataValue, String datadesc) {
        this.dataId = dataId;
        this.dataName = dataName;
        this.dataValue= dataValue;
        this.datadesc= datadesc;
    }

    //getters
}