通过获取字段的串联对JPA实体进行分组

mfpqipee  于 2022-11-30  发布在  其他
关注(0)|答案(1)|浏览(126)

我从JPA存储库查询中检索引用这些表的实体
| 识别码|名称名称名称|城市名称|
| - -|- -|- -|
| 一个|若翰|纽约|
| 2个|保禄|亚特兰大|
| 三个|标记|洛杉矶|
| 四个|苏姗|洛杉矶|
| 五个|约什|纽约|
| 六个|查尔斯|亚特兰大|
我想按我的“按城市划分的实体列表”分组,并获得以下响应:

{"New York":["John","Josh"],"Atlanta":["Paul", "Charles"],"Los Angeles":["Mark","Susan"]}

我试着跟随This link,但是我只能得到一个Map〈String,List< RegistryEntity >。我不想要这些,我想要Map〈String,List< String >〉,所以我用了这些方法。

public Map<String, List<String>> findAllUsers() {
    List<RegistryEntity> items = registryRepository.findAll();
    Map<String, List<String>> itemsGrouped = new HashMap<>();
    for (RegistryEntity s: items) {
        if (itemsGrouped.get(s.getCity()) != null) {
            itemsGrouped.get(s.getCity()).add(s.getName());
        }
        else {
            List<String> tempResults = new ArrayList<>();
            tempResults.add(s.getCity());
            itemsGrouped.put(s.getName(), tempResults);
        }
    }
    return itemsGrouped;
}

代码可以工作,但我想知道是否有更有效和更优雅的东西来按我的实体分组。

j9per5c4

j9per5c41#

你可以使用流,然后你还需要collector.groupingBy和collector.mapping,我试着编写类似下面的代码。

Map<String, List<String>> itemsGrouped = 
    items.stream()
           .collect(Collectors.groupingBy(
               RegistryEntity::getCity,
               Collectors.mapping(RegistryEntity::getName, Collectors.toList()))
           );

相关问题