如何按字段将记录列表分组到内部包含列表的对象中

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;
    }