SpringData JPA - 为 class 提供了错误类型的 id。预期:类 java.lang.Integer,得到类 java.lang.Long

bes*_*art 5 mysql spring-data-jpa

我在使用 Spring JPA 并尝试检索对象列表时遇到了这个问题。

这是我试图检索的课程

@Entity
@Table(name="OBJECTSTERMIC")
public class TermicObject {

    @Id
    @Column(name="TERMICID")
    private long termicId;

    @MapsId
    @OneToOne(fetch = FetchType.LAZY)
    @JoinColumn(name="OBJECTID",columnDefinition="INTEGER")
    private Object object;

    @Column(name="CONTECA_RIF")
    private int contecaRif;

    @Column(name="CONTECA_VAL")
    private int contecaVal;

    @Column(name="TYPE")
    private String type;

//getters and setters
Run Code Online (Sandbox Code Playgroud)

Object班有存储为整数MySQL的主键,这的确是Object

@Entity
public class Object {

    @Column(name="OBJECTID")
    @Id
    @JsonProperty("OBJECTID")
    private int objectId;
    ....
Run Code Online (Sandbox Code Playgroud)

所以,无处设置长...

现在,我只是调用一个服务类

@Override
    public List<TermicObject> findAll() {

        return repository.findAll();
    }
Run Code Online (Sandbox Code Playgroud)

并得到了这个例外

org.springframework.dao.InvalidDataAccessApiUsageException: org.hibernate.TypeMismatchException: Provided id of the wrong type for class it.besmart.db_eipo.persistence.model.Object. Expected: class java.lang.Integer, got class java.lang.Long; nested exception is java.lang.IllegalArgumentException: org.hibernate.TypeMismatchException: Provided id of the wrong type for class it.besmart.db_eipo.persistence.model.Object. Expected: class java.lang.Integer, got class java.lang.Long
Run Code Online (Sandbox Code Playgroud)

在哪里设置对象 ID 应该是长的?

Lub*_*ubo 5

查看您的存储库的定义。它有正确的泛型类型吗?你有整数作为第二个参数吗?恕我直言,这可能是根本原因。请参阅建议的正确版本:

@RepositoryRestResource
public interface TermicObjectRepository extends JpaRepository<TermicObject, Integer> {
    public Optional<TermicObject> findById(Integer id);
    public List<TermicObject> findAll()
}
Run Code Online (Sandbox Code Playgroud)


Jen*_*der 0

不完全确定,但我认为这个映射

@Id
@Column(name="TERMICID")
private long termicId;

@MapsId
@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name="OBJECTID",columnDefinition="INTEGER")
private Object object;
Run Code Online (Sandbox Code Playgroud)

使匹配的 idObject值为termicIdlong。