繁体   English   中英

弹簧数据 jpa。 返回 Map 作为 group by 操作的结果

[英]Spring data jpa. Return Map as result of group by operation

我的 jpa 存储库界面中有一个查询。

@Query("select e.campaignId, e from CampaignCrTargetingProfile e where e.campaignId in :ids group by e.campaignId")
public Map<Integer, List<CampaignCrTargetingProfile>> findByCampaignIdIn(@Param("ids") Iterable<Integer> ids);

CampaignId 是整数。

但是当我尝试执行这个查询时,我发现了一个异常。

Caused by: org.springframework.core.convert.ConverterNotFoundException: No converter found capable of converting from type java.lang.Integer to type java.util.Map<?, ?>
at org.springframework.core.convert.support.GenericConversionService.handleConverterNotFound(GenericConversionService.java:311) ~[spring-core-4.1.5.RELEASE.jar:4.1.5.RELEASE]
at org.springframework.core.convert.support.GenericConversionService.convert(GenericConversionService.java:192) ~[spring-core-4.1.5.RELEASE.jar:4.1.5.RELEASE]
at org.springframework.core.convert.support.ArrayToObjectConverter.convert(ArrayToObjectConverter.java:66) ~[spring-core-4.1.5.RELEASE.jar:4.1.5.RELEASE]
at org.springframework.core.convert.support.ConversionUtils.invokeConverter(ConversionUtils.java:35) ~[spring-core-4.1.5.RELEASE.jar:4.1.5.RELEASE]
... 192 common frames omitted

是否可以按其字段摸索实体并将结果作为 Map 返回? 如果不可能,是否有另一种方法可以制作类似的东西?

您可以从 JPQL 查询中获取一个列表,然后使用 Java 8 Stream API 将其转换为映射。

// This method in your Repository interface
@Query("SELECT e FROM CampaignCrTargetingProfile e WHERE e.campaignId IN :ids")
public List<CampaignCrTargetingProfile findByCampaignIdIn(@Param("ids") Iterable<Integer> ids);

// This source from your Service class
List<CampaignCrTargetingProfile> list = repo.findByCampaignIdIn(iterableArg);
Map<Integer, List<CampaignCrTargetingProfile>> mapResult = list.stream()
    .collect(Collectors.groupingBy(CampaignCrTargetingProfile::getCampaignId));

最好让 DBMS 准备 GROUP BY 操作,但为了获得 Map 作为结果,上述代码可以使用 Java 8 Stream API 仅用一行代码来准备它。
据我所知,spring 数据不支持 Map 的结果类型。
它效率低下,但我建议它用于小数据集。

重要的

我建议当您的数据集包含少量条目并且您绝对确定此数量将来不会增长时才使用此解决方案,例如。 当您使用分页来限制结果集或枚举值表时,因为正如@adamwilliams 评论的那样,应用程序在内存中进行分组是低效的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM