Java 使用多个列进行分组有问题吗?

Java 使用多个列进行分组有问题吗?,java,Java,我有这个方法: public List<IncomeChannelCategoryMap> allIncomeChannels(final List<String> list) { final CriteriaQuery<IncomeChannelCategoryMap> criteriaQuery = builder.createQuery(IncomeChannelCategoryMap.class); final Root<Inco

我有这个方法:

public List<IncomeChannelCategoryMap> allIncomeChannels(final List<String> list) {
    final CriteriaQuery<IncomeChannelCategoryMap> criteriaQuery = builder.createQuery(IncomeChannelCategoryMap.class);
    final Root<IncomeChannelMapEntity> root = criteriaQuery.from(IncomeChannelMapEntity.class);

    final List<Selection<?>> selections = new ArrayList<>();
    selections.add(root.get(IncomeChannelMapEntity_.incomeChannel).get(IncomeChannelEntity_.code));
    selections.add(root.get(IncomeChannelMapEntity_.logicalUnitCode));
    selections.add(root.get(IncomeChannelMapEntity_.logicalUnitIdent));
    selections.add(root.get(IncomeChannelMapEntity_.keyword));
    criteriaQuery.multiselect(selections);
    Predicate codePredicate = root.get(IncomeChannelMapEntity_.incomeChannel).get(IncomeChannelEntity_.code).in(list);
    criteriaQuery.where(codePredicate);
    return entityManager.createQuery(criteriaQuery).getResultList();

}

一切都很好,但有一个问题:

例如,直销可以有另一个logicalUnitCode,所以现在我只得到一个,我想为logicalUnitCode取得成功,就像我为logicalUnitCode取得成功一样

有什么建议吗? 因此,我想要实现的是:

      {
        "incomeChannelCode": "DIRECT_SALES",
        "logicalUnitCode": "R_CATEGORY","R_TYPE",
        "logicalUnitIdent": "7,8"
      }

以下是您的更新代码:

@Override
public List<IncomeChannelCategoryMap> allIncomeChannels(final EntityRequest<IncomeChannel> request) throws ApiException {
    List<String> lists = request.getEntity().getIncomeChannels();
    List<IncomeChannelCategoryMap> channels = incomeChannelMapDAO.allIncomeChannels(lists);
    return new ArrayList<>(channels.stream().collect(Collectors.toMap(IncomeChannelCategoryMap::getIncomeChannelCode,
            Function.identity(), (i1, i2) -> {
                i1.setLogicalUnitIdent(i1.getLogicalUnitIdent() + ", " + i2.getLogicalUnitIdent());
                if (!i1.getLogicalUnitCode().contains(i2.getLogicalUnitCode())) {
                    i1.setLogicalUnitCode(i1.getLogicalUnitCode() + ", " + i2.getLogicalUnitCode());
                }
                return i1;
            })).values());
}
@覆盖
公共列表allIncomeChannels(最终EntityRequest请求)引发异常{
List lists=request.getEntity().getIncomeChannels();
列表通道=incomechannellmapdao.allIncomeChannels(列表);
返回新的ArrayList(channels.stream().collect(Collectors.toMap)(IncomeChannelCategoryMap::getIncomeChannelCode、,
Function.identity(),(i1,i2)->{
i1.SetLogicalInitiadent(i1.GetLogicalInitiadent()+”,“+i2.GetLogicalInitiadent());
如果(!i1.getLogicalUnitCode()。包含(i2.getLogicalUnitCode())){
i1.setLogicalUnitCode(i1.getLogicalUnitCode()+”,“+i2.getLogicalUnitCode());
}
返回i1;
})).values());
}

就像
logicalinitident
一样,现在
logicalUnitCode
也将被分组。这里我假设你不想在这里重复。我所说的重复是指,如果两个结果的
logicalUnitCode
都是
“R\u CATEGORY”
,那么您希望它作为输出一次。如果一个是
“R\u CATEGORY”
,另一个是
“R\u TYPE”
,则希望将它们分组为
“R\u CATEGORY,R\u TYPE”
,作为输出。如果我的假设是正确的,那么这就是您所需的答案。

您好,无。那
R\u类型
是从哪里来的?我在原始输出中看不到它。
[
{
    "incomeChannelCode": "DIRECT_SALES",
    "logicalUnitCode": "R_CATEGORY",
    "logicalUnitIdent": "7"
  },
  {
    "incomeChannelCode": "DIRECT_SALES",
    "logicalUnitCode": "R_CATEGORY",
    "logicalUnitIdent": "8"
  }
]
      {
        "incomeChannelCode": "DIRECT_SALES",
        "logicalUnitCode": "R_CATEGORY","R_TYPE",
        "logicalUnitIdent": "7,8"
      }
@Override
public List<IncomeChannelCategoryMap> allIncomeChannels(final EntityRequest<IncomeChannel> request) throws ApiException {
    List<String> lists = request.getEntity().getIncomeChannels();
    List<IncomeChannelCategoryMap> channels = incomeChannelMapDAO.allIncomeChannels(lists);
    return new ArrayList<>(channels.stream().collect(Collectors.toMap(IncomeChannelCategoryMap::getIncomeChannelCode,
            Function.identity(), (i1, i2) -> {
                i1.setLogicalUnitIdent(i1.getLogicalUnitIdent() + ", " + i2.getLogicalUnitIdent());
                if (!i1.getLogicalUnitCode().contains(i2.getLogicalUnitCode())) {
                    i1.setLogicalUnitCode(i1.getLogicalUnitCode() + ", " + i2.getLogicalUnitCode());
                }
                return i1;
            })).values());
}