spring-data-jpa Spring Data jpa.返回作为group by操作结果的Map

2ledvvac  于 2022-11-10  发布在  Spring
关注(0)|答案(1)|浏览(217)

我在我的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的形式返回结果?如果不可能,有没有其他方法来创建类似的东西?

lvmkulzt

lvmkulzt1#

您可以从JPQL查询中获取一个列表,然后使用Java8 StreamAPI将其转换为Map。

// 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 Data 不支持Map的结果类型。
这是低效的,但我建议它用于小数据集。

重要事项

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

相关问题