如何在Spring Data JPA中为CrudRepository设置@Id字符串?

62o28rlo  于 2022-12-10  发布在  Spring
关注(0)|答案(5)|浏览(106)

问题是,我在使用@RepositoryRestResource作为扩展JpaRepositoryUserRepository时遇到异常。
原因是findById在默认情况下只接受LongInt类型,即使我
@Id String id;,而不是实体定义中的@Id Int id
我已经尝试搜索StackOverflow和谷歌,但还没有找到任何解决方案.
错误消息如下:
"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\""
我想让它工作
@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;
kninwzqo

kninwzqo1#

您必须变更存放库中ID类型参数的类型,以符合实体上的ID属性类型。
来自Spring文档:

Interface Repository<T,ID>
Type Parameters:
  T - the domain type the repository manages    
  ID - the type of the id of the entity the repository manages

基于

@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> {
    //..
    }

请参阅:

9gm1akwq

9gm1akwq2#

您可以尝试以下操作:

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

如果你想了解更多关于这个主题的信息,你可以开始寻找throw herehere

gtlvzcf8

gtlvzcf83#

根据最新版本的spring data jpa(2.1.10 GA),您可以像

一样使用它
这里是link

6rqinv9w

6rqinv9w4#

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中已有的类名相同的类名是不好的做法。

vlurs2pr

vlurs2pr5#

我认为有一种方法可以解决这个问题。
比如说,Site是我们的@Entity。

@Id
private String id;

getters setters

然后可以按如下所示调用findById

Optional<Site> site = getSite(id);

注意:这对我很有效,我希望它能帮助到一些人。

相关问题