我在我的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的形式返回结果?如果不可能,有没有其他方法来创建类似的东西?
1条答案
按热度按时间lvmkulzt1#
您可以从JPQL查询中获取一个列表,然后使用Java8 StreamAPI将其转换为Map。
最好让DBMS准备GROUP BY操作,但为了获得Map作为结果,上述代码可以使用Java 8 Stream API仅用一行代码来准备它。
据我所知,Spring Data 不支持Map的结果类型。
这是低效的,但我建议它用于小数据集。
重要事项
我建议仅当您的数据集包含少量条目,并且您绝对确定该数量在未来不会增长时,才使用此解决方案,例如,当您使用分页来限制结果集或枚举值表时,因为正如@adamwilliams注解的那样,应用程序在内存中进行分组效率低下。