spring-data-jpa SpringData JPA -为类提供的ID类型错误,应为:类java.lang.整型,得到了类java.lang.Long

wbgh16ku  于 2022-11-10  发布在  Spring
关注(0)|答案(6)|浏览(195)

我在使用SpringJPA并尝试检索对象列表时遇到了这个问题。
这是我试图检索的类

@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

在MySQL中,Object类的主键存储为整数,实际上这是Object

@Entity
public class Object {

    @Column(name="OBJECTID")
    @Id
    @JsonProperty("OBJECTID")
    private int objectId;
    ....

所以,没有地方设置一个长...
现在,我只需调用一个服务类。

@Override
    public List<TermicObject> findAll() {

        return repository.findAll();
    }

并得到了这个异常

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

在何处设置对象ID应为长整型?

s5a0g9ez

s5a0g9ez1#

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

@RepositoryRestResource
public interface TermicObjectRepository extends JpaRepository<TermicObject, Integer> {
    public Optional<TermicObject> findById(Integer id);
    public List<TermicObject> findAll()
}
11dmarpk

11dmarpk2#

根据@Lubo的回答,在我的例子中,我遇到了String和Long类型之间的兼容性问题,由于我的模型需要一个Long自动生成的id,我不得不更改存储库

public interface ProductRepository extends JpaRepository<Product, String> {
}

public interface ProductRepository extends JpaRepository<Product, Long> {
}

我的控制器来自

@RequestMapping(path = "/products/delete/{id}", method = RequestMethod.DELETE)
public void deleteProduct(@PathVariable(name = "id") String id) {
    productRepository.deleteById(id);
}

@RequestMapping(path = "/products/delete/{id}", method = RequestMethod.DELETE)
public void deleteProduct(@PathVariable(name = "id") Long id) {
    productRepository.deleteById(id);
}
yv5phkfx

yv5phkfx3#

您必须将ID定义为Long数据类型。

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

还要在存储库界面中进行更改:

public interface ProductRepository extends JpaRepository<Product, Long> {
}
oiopk7p5

oiopk7p54#

得到这个是因为

public class MyEntity {
  @Id()
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  @Column(name = "id", nullable = false)
  private int id;  // <-------- int

  ...

  public long getId() { return id; } // <-------- long

}
vs3odd8k

vs3odd8k5#

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

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

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

使Object的ID与termicId的值(长整型)匹配。

mm5n2pyu

mm5n2pyu6#

使用了

Long.valueOf(intValue)

将int类型转换为Long类型,因为您将Long类型定义为@Id

相关问题