无法从类型[java.util.LinkedHashSet <?>]转换为类型[java.util.Set <java.lang.Long>]

问题描述

我当前正在将项目从Java 8 with Springboot 1.5.9.RELEASE更新为Java 11 with Springboot 2.2.7.RELEASE。我能够使它运行,尽管在进行测试时,对其的一个查询不再起作用。它抛出了Failed to convert from type [java.util.LinkedHashSet<?>] to type [java.util.Set<java.lang.Long>]... nested exception is org.springframework.core.convert.ConverterNotFoundException: No converter found capable of converting from type [project.Param] to type [java.lang.Long]。该项目的构建也非常完美,并且在以下所述的类中没有任何过时项目的警告。

这就是我在服务中的称呼方式:

Set<Long> ids = ParamRepository.findIdByCampaign(campaign);

Param.java

@Entity
@Table(name = "PARAM")
public class Param implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @Column(name = "ID_PARAM",updatable = false,nullable = false)
    private Long id;

    @ManyToOne(cascade = CascadeType.MERGE,fetch = FetchType.LAZY)
    @JoinColumn(name = "ID_CAMPAIGN",nullable = false)
    private Campaign campaign;

ParamRepository.java

@Repository 
public interface ParamRepository extends JpaRepository<Param,Long> {
        Set<Long> findIdByCampaign(Campaign campaign);
    }

我尝试将 JpaRepository 更改为 JpaRepository ,因为除了findByCampaign查询之外,它还涉及其他本机查询。尽管自从以前就可以使用以来这没有意义,所以我不太确定接下来要检查什么。

关于为什么会发生错误或我应该进一步检查的其他想法?预先谢谢你!

解决方法

findIdByCampaign将返回实体集合的意思是Param而不是Long,您应该仅选择id来获得Set of Long。

要仅选择id,可以使用带有@Query批注的JPQL。

@Query("Select p.id from Param p where p.campaign = :campaign")
Set<Long> findIdByCampaign(@Param("campaign") Campaign campaign);

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...