【问题标题】:xHow can I have @Id string for CrudRepository in Spring with Spring Data JPA?如何使用 Spring Data JPA 在 Spring 中为 CrudRepository 提供 @Id 字符串?
【发布时间】:2019-12-17 16:44:03
【问题描述】:

问题是我的 UserRepository 扩展 JpaRepository 时使用 @RepositoryRestResource 时出现异常。

原因是findById默认只接受LongInt类型,即使我有

@Id String id; 而不是@Id Int id 在我的实体定义中。

我已经尝试搜索 StackOverflow 和 Google,但没有找到任何解决方案。

错误信息如下:

"Failed to convert from type [java.lang.String] to type [java.lang.Integer] for value '3175433272470683'; nested exception is java.lang.NumberFormatException: For input string: \"3175433272470683\""

我想让它与 a 一起工作

@Id String id;

有什么建议吗?

非常感谢您的进步。很荣幸在这里提问。

实体类:

@Entity // This tells Hibernate to make a table out of this class
@Table(name = "users")
public class XmppUser {
    @Id
    private java.lang.String username;

    private String password;
    private String serverkey;
    private String salt;
    private int iterationcount;
    private Date created_at;

    //    @Formula("ST_ASTEXT(coordinates)")
//    @Column(columnDefinition = "geometry")
//    private Point coordinates;
    //    private Point coordinates;
    private String full_name;

    @OneToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "username", nullable = true)
    private XmppLast xmppLast;

【问题讨论】:

  • 能否贴出实体类代码?
  • 刚刚发布了一个实体类

标签: java spring hibernate spring-data-jpa spring-hateoas


【解决方案1】:

您必须更改存储库中 ID 类型参数的类型以匹配您实体上的 id 属性类型。

基于

@Entity // This tells Hibernate to make a table out of this class
@Table(name = "users")
public class XmppUser {
    @Id
    private java.lang.String username;
    //...

    }

应该是

public interface UserRepository extends CrudRepository<XmppUser, String> {
    //..
    }

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

【讨论】:

  • 刚刚添加到存储库:@Override Optional&lt;XmppUser&gt; findById(String integer);
  • 上面写着:method does not override method from its superclass
  • @DavidJones ,我添加了一个例子
  • @admiz635 这正是我所拥有的,在其中:@Override Optional&lt;XmppUser&gt; findById(String integer);
  • 哦,我的错。刚刚注意到CrudRepository&lt;XmppUser, String&gt; 的第二个类型参数是一个字符串!这解决了问题!干得好@admiz635!
【解决方案2】:

我认为有一种方法可以解决这个问题。

假设,Site 是我们的@Entity。

@Id
private String id;

getters setters

然后你可以调用 findById 如下

 Optional<Site> site = getSite(id);

注意:这对我有用,我希望它对某人有所帮助。

【讨论】:

    【解决方案3】:

    JpaRepository 是 CrudRepository 的一个特例。 JpaRepository 和 CrudRepository 都声明了两个类型参数,T 和 ID。您将需要提供这两种类类型。例如,

    public interface UserRepository extends CrudRepository<XmppUser, java.lang.String> {
    //..
    }
    

    public interface UserRepository extends JpaRepository<XmppUser, java.lang.String> {
    //..
    }
    

    注意第二个类型java.lang.String必须匹配主键属性的类型。在这种情况下,您不能将其指定为StringInteger,而是改为java.lang.String

    尽量不要将自定义类命名为String。使用与 JDK 中已有的类名相同的类名是一种不好的做法。

    【讨论】:

      【解决方案4】:

      根据最新版spring data jpa(2.1.10 GA),可以像这样使用

      这里是link

      【讨论】:

      • @DavidJones 所以你的 spring data jpa 版本是?
      • 版本:2.1.9.RELEASE
      • @DavidJones 试试这样:@Id @GeneratedValue(strategy = GenerationType.AUTO) @Column(name = "id") private String id;
      • 不能解决问题。我预计 Spring 的问题会更少。这是我今天发现的第二个错误。
      【解决方案5】:

      你可以试试这样的:

      @Id
      @GeneratedValue(generator = "uuid")
      @GenericGenerator(name = "uuid", strategy = "uuid2")
      @Column(name = "PR_KEY")
      private String prKey;
      

      如果您想了解有关此主题的更多信息,可以开始查找 throw herehere

      【讨论】:

      • 试过了。它不起作用。同样的错误。刚刚又试了一次。
      猜你喜欢
      • 2018-09-19
      • 2018-08-15
      • 2018-08-30
      • 2012-12-04
      • 2021-03-16
      • 2017-11-19
      • 2014-05-16
      • 2018-11-29
      • 2016-06-18
      相关资源
      最近更新 更多