【问题标题】:JPA / Spring / Delete Entity, type Mismatch (int/long for id)JPA / Spring / 删除实体,类型不匹配(id 为 int/long)
【发布时间】:2016-01-08 01:41:56
【问题描述】:

我有一个使用

的实体
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;

我有这个实体的 JPA 存储库。现在我想删除其中一个,但标准方法是delete(int i),因为我的 ID 不是整数,而是长整数,所以它不起作用。所以除了使用int 作为我的 ID 之外,这里还能做什么?我可以指定一个使用 long 的自定义删除方法,就像它与 findbyXX(XX) 一起使用吗?

编辑: 首先:是的,我正在使用 Data JPA!

我想这样做:

   jparepository.delete(id);

如果 id 是整数:

org.hibernate.TypeMismatchException: Provided id of the wrong type for class com.Entity. Expected: class java.lang.Long, got class java.lang.Integer

如果 id 很长:

no method found for delete(long)

所以我可以将我的 ID 更改为 int(我不想这样做),或者找到一种方法让存储库与 long 一起工作。问题是如何

【问题讨论】:

  • 假设您使用的是spring data jpa,您使用的是什么版本?

标签: java spring hibernate jpa


【解决方案1】:

好吧,事实证明这只是一个愚蠢的错误。所以我的 JPARepository 看起来像这样:

public interface EntityRepository extends JpaRepository<Entity, Integer> {

但是Integer 代表实体 ID 字段的类型,在我的例子中是 Long。 所以我需要更改为 ..JpaRepository&lt;Entity, Long&gt;

【讨论】:

    【解决方案2】:

    如果你使用的是Spring Data JPA,默认的删除方法是:

    void delete(T entity); 
    

    看这里: Spring Data JPA Docs

    另外,你最好使用 Long 而不是原始 long,因为这样你可以在验证时使用更多的方法:

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    

    【讨论】:

    • 我也尝试这样做,但我得到了同样的错误(我将它添加到我的问题中):类型不匹配。那是因为首先我必须通过 id 获取实体,例如 repository.findOne(id);,默认情况下它也适用于 int。
    【解决方案3】:

    假设您正在谈论 Spring Data JPA,是的,如果您想通过用户定义的内容进行删除,您可以指定自定义方法,但这对于按 ID 删除不是必需的。请参阅春季文档:

    http://docs.spring.io/spring-data/data-commons/docs/current/api/org/springframework/data/repository/CrudRepository.html#delete-ID-

    您可以通过与您的实体 ID 类型(在您的情况下为 Long)相对应的通用 ID 类型进行删除。这应该可以。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-08-14
      • 1970-01-01
      • 2018-11-13
      • 2011-07-17
      • 1970-01-01
      • 1970-01-01
      • 2016-03-30
      • 2017-12-11
      相关资源
      最近更新 更多