CrudRepository调用findById时按name查询而非id的修复咨询
问题说明
调用findById方法时,终端生成的SQL语句为where name=?,需要修改为where id=?。
问题原因及解决方案
核心问题
- @Id注解位置错误:你把
@jakarta.persistence.Id注解放在了first_name字段上方,导致JPA将first_name识别为主键字段,所以findById会基于这个字段生成查询条件。 - Repository泛型类型不匹配:
UserRepository继承CrudRepository<User, String>,但实体类的主键Id是Integer类型,泛型类型不一致会引发潜在问题。
修改步骤
- 将
@jakarta.persistence.Id注解移动到Id字段的上方,明确标记主键。 - 把
UserRepository的泛型参数从String改为Integer,和主键类型保持一致。 - (可选)建议遵循Java驼峰命名规范,将字段名
Id改为id,first_name改为firstName等,提升代码可读性。
修改后的代码示例
User实体类
package com.appzat.carpious.models; import jakarta.persistence.Column; import jakarta.persistence.Entity; import jakarta.persistence.Id; import jakarta.persistence.Table; @Entity @Table(name="users") public class User { @Id private Integer id; @Column(name="first_name") private String firstName; @Column(name="last_name") private String lastName; private String email; public void setEmail(String email) { this.email = email; } public String getEmail(){ return this.email; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public void setFirstName(String firstName) { this.firstName = firstName; } public void setLastName(String lastName) { this.lastName = lastName; } public String getFirstName(){ return this.firstName; } public String getLastName(){ return this.lastName; } }
UserRepository接口
package com.appzat.carpious.repositories; import org.springframework.data.repository.CrudRepository; import com.appzat.carpious.models.User; import org.springframework.stereotype.Repository; @Repository public interface UserRepository extends CrudRepository<User, Integer> { }
内容的提问来源于stack exchange,提问作者Apoorv
相关产品推荐
相关产品推荐

