如何按字段将记录列表分组到内部包含列表的对象中
How to group a List of records by fields into an Object with Lists inside
我试图找出如何做到这一点,但我被卡住了,我需要一些帮助。
完成复杂的 SQL 查询并将其结果分配给 JPA 实体后,该实体将查询结果映射为视图,我得到了这个列表,其中每个条目都是这样的(这些记录的列表称为 resultList):
rowId, cf, c1, c2, dt, sx rsd, id_c, cost, gest, idImp, descImp, costImp, idPren,descPren
1, XXXXX, C1, C2, DT, SX, RSD, ID_C, COST, GEST, IDIMP1, DESCIMP1,
COSTIMP1, IDPREN1_1, DESCPREN1_1
2, XXXXX, C1, C2, DT, SX, RSD, ID_C, COST, GEST, IDIMP1, DESCIMP1,
COSTIMP1, IDPREN1_2, DESCPREN1_2
3, XXXXX, C1, C2, DT, SX, RSD, ID_C, COST, GEST, IDIMP2, DESCIMP1,
COSTIMP1, IDPREN2_1, DESCPREN2_1
idImp之前的所有字段,因为查询,总是相同的。
我正在尝试将所有这些记录收集到 class ResultContainerGrouped 的对象中,该对象具有可变元素列表。
所以 3 个条目将变为:
XXXXX, C1, C2, DT, SX, RSD, ID_C, COST, GEST, { [IDIMP1, DESCIMP1, COSTIMP1 {[IDPREN1_1, DESCPREN1_1], [IDPREN1_2, DESCPREN1_2]} ], [IDIMP2, DESCIMP1, COSTIMP1 { [ IDPREN2_1, DESCPREN2_1 ] } ] }
public class ResultContainerGrouped{
protected String cf;
protected String c1;
protected String c2;
protected String dt;
protected String sx;
protected String rsd;
protected String id_c;
protected String cost;
protected String gest;
protected List<Imp> listR;
}
public class Imp{
protected String idImp;
protected String descImp;
protected String costImp;
protected List<Pren> listP;
}
public class Pren{
protected String idPren;
protected String descPren;
}
public class ResultContainerRecords{
protected String cf;
protected String c1;
protected String c2;
protected String dt;
protected String sx;
protected String rsd;
protected String id_c;
protected String cost;
protected String gest;
// represents List<Imp> listR;
protected String idImp;
protected String descImp;
protected String costImp;
// represents List<Pren> listP;
protected String idPren;
protected String descPren;
}
我曾想过使用流(我不熟悉流,我正在努力适应它),但我不知道它是否合适,因为我有不同的键(我应该先使用 groupBy对于 idImp,然后对于 idPren?)
我实际上得到了 groupBy idImp,但我不知道如何处理 idImp 中的其他列表。
我将静态值设置为:
resultContainerGrouped.setCf(resultList.get(0).getCf())
...
然后我使用流按 ListR 进行分组,但我不知道如何在 ListR 中使用 ListP。
Map<String, List<ResultContainerRecords>> mapR = resultList.stream()
.collect(Collectors.groupingBy(ResultContainerRecords::idImp));
mapR.values().stream().forEach(x -> resultContainerGrouped.getListR().add(buildR(x)));
其中 buildR 是用于为每个 mapR 值创建一个列表到 responseGrouped 的 ListR 的方法
private ListR buildR (List<ResultContainerRecords> x) {
ListR result = new ListR();
result.setCostImp(x.get(0).getCostImp());
result.setIdImp(x.get(0).getIdImp());
if ((!StringUtils.isEmpty(x.get(0).getDescImp())))
result.setDescImp(x.get(0).getDescImp());
return result;
}
非常感谢任何帮助,谢谢!
解决方案是再次分组,在我从记录构建对象的方法中。
Map<String, List<ResultContainerRecords>> mapR = resultList.stream()
.collect(Collectors.groupingBy(ResultContainerRecords::idImp));
mapR.values().stream().forEach(x -> resultContainerGrouped.getListR().add(buildR(x)));
buildR 为
private ListR buildR (List<ResultContainerRecords> x) {
ListR result = new ListR();
List<ListP> listP = new ArrayList<>();
result.setCostImp(x.get(0).getCostImp());
result.setIdImp(x.get(0).getIdImp());
if ((!StringUtils.isEmpty(x.get(0).getDescImp()))) result.setDescImp(x.get(0).getDescImp());
Map<String, List< ResultContainerRecords >> mapR = x.stream().collect(Collectors.groupingBy(ResultContainerRecords::getIdPren));
mapR.values().stream().forEach(y -> result.getListP().add(buildP(y)));
result.getListP().addAll(listP);
return result;
}
最后为 Pren 构建 P
private ListP buildP (List< ResultContainerRecords > y) {
ListPr result = new ListP();
result.setIdPren(z.get(0).getIdPren());
result.setDescPren(z.get(0).getDescPren());
return result;
}
我试图找出如何做到这一点,但我被卡住了,我需要一些帮助。
完成复杂的 SQL 查询并将其结果分配给 JPA 实体后,该实体将查询结果映射为视图,我得到了这个列表,其中每个条目都是这样的(这些记录的列表称为 resultList):
rowId, cf, c1, c2, dt, sx rsd, id_c, cost, gest, idImp, descImp, costImp, idPren,descPren
1, XXXXX, C1, C2, DT, SX, RSD, ID_C, COST, GEST, IDIMP1, DESCIMP1, COSTIMP1, IDPREN1_1, DESCPREN1_1
2, XXXXX, C1, C2, DT, SX, RSD, ID_C, COST, GEST, IDIMP1, DESCIMP1, COSTIMP1, IDPREN1_2, DESCPREN1_2
3, XXXXX, C1, C2, DT, SX, RSD, ID_C, COST, GEST, IDIMP2, DESCIMP1, COSTIMP1, IDPREN2_1, DESCPREN2_1
idImp之前的所有字段,因为查询,总是相同的。 我正在尝试将所有这些记录收集到 class ResultContainerGrouped 的对象中,该对象具有可变元素列表。 所以 3 个条目将变为:
XXXXX, C1, C2, DT, SX, RSD, ID_C, COST, GEST, { [IDIMP1, DESCIMP1, COSTIMP1 {[IDPREN1_1, DESCPREN1_1], [IDPREN1_2, DESCPREN1_2]} ], [IDIMP2, DESCIMP1, COSTIMP1 { [ IDPREN2_1, DESCPREN2_1 ] } ] }
public class ResultContainerGrouped{
protected String cf;
protected String c1;
protected String c2;
protected String dt;
protected String sx;
protected String rsd;
protected String id_c;
protected String cost;
protected String gest;
protected List<Imp> listR;
}
public class Imp{
protected String idImp;
protected String descImp;
protected String costImp;
protected List<Pren> listP;
}
public class Pren{
protected String idPren;
protected String descPren;
}
public class ResultContainerRecords{
protected String cf;
protected String c1;
protected String c2;
protected String dt;
protected String sx;
protected String rsd;
protected String id_c;
protected String cost;
protected String gest;
// represents List<Imp> listR;
protected String idImp;
protected String descImp;
protected String costImp;
// represents List<Pren> listP;
protected String idPren;
protected String descPren;
}
我曾想过使用流(我不熟悉流,我正在努力适应它),但我不知道它是否合适,因为我有不同的键(我应该先使用 groupBy对于 idImp,然后对于 idPren?)
我实际上得到了 groupBy idImp,但我不知道如何处理 idImp 中的其他列表。
我将静态值设置为:
resultContainerGrouped.setCf(resultList.get(0).getCf())
...
然后我使用流按 ListR 进行分组,但我不知道如何在 ListR 中使用 ListP。
Map<String, List<ResultContainerRecords>> mapR = resultList.stream()
.collect(Collectors.groupingBy(ResultContainerRecords::idImp));
mapR.values().stream().forEach(x -> resultContainerGrouped.getListR().add(buildR(x)));
其中 buildR 是用于为每个 mapR 值创建一个列表到 responseGrouped 的 ListR 的方法
private ListR buildR (List<ResultContainerRecords> x) {
ListR result = new ListR();
result.setCostImp(x.get(0).getCostImp());
result.setIdImp(x.get(0).getIdImp());
if ((!StringUtils.isEmpty(x.get(0).getDescImp())))
result.setDescImp(x.get(0).getDescImp());
return result;
}
非常感谢任何帮助,谢谢!
解决方案是再次分组,在我从记录构建对象的方法中。
Map<String, List<ResultContainerRecords>> mapR = resultList.stream()
.collect(Collectors.groupingBy(ResultContainerRecords::idImp));
mapR.values().stream().forEach(x -> resultContainerGrouped.getListR().add(buildR(x)));
buildR 为
private ListR buildR (List<ResultContainerRecords> x) {
ListR result = new ListR();
List<ListP> listP = new ArrayList<>();
result.setCostImp(x.get(0).getCostImp());
result.setIdImp(x.get(0).getIdImp());
if ((!StringUtils.isEmpty(x.get(0).getDescImp()))) result.setDescImp(x.get(0).getDescImp());
Map<String, List< ResultContainerRecords >> mapR = x.stream().collect(Collectors.groupingBy(ResultContainerRecords::getIdPren));
mapR.values().stream().forEach(y -> result.getListP().add(buildP(y)));
result.getListP().addAll(listP);
return result;
}
最后为 Pren 构建 P
private ListP buildP (List< ResultContainerRecords > y) {
ListPr result = new ListP();
result.setIdPren(z.get(0).getIdPren());
result.setDescPren(z.get(0).getDescPren());
return result;
}