Hibernate JPA查询时忽略getter方法仅使用私有字段的解决方案
问题根因
你的@Transient注解未生效是JPA访问策略导致的:
- 你将
@Id注解标注在字段id上,JPA默认使用FIELD访问策略,只会扫描处理字段上的注解,方法上的@Transient会被直接忽略 - Hibernate会按照JavaBean命名规范匹配
getId()方法为id属性的读取入口,因此调用CrudRepository时会尝试调用该方法获取主键值,触发类型转换错误
可行解决方案
方案1(最符合你的需求,无需修改现有方法逻辑)
直接在实体类上添加@Access注解强制全局使用字段访问策略,Hibernate会直接读取所有字段的值,完全忽略所有getter/setter的映射逻辑:
import javax.persistence.Access; import javax.persistence.AccessType; @Entity @Inheritance(strategy = InheritanceType.SINGLE_TABLE) @Access(AccessType.FIELD) // 新增这行即可 public class myEntity { @Id private String id; // 该方法不会被Hibernate识别,@Transient可加可不加 public ID getId() { return new ID(this.id); } // ... 其他原有代码保持不变 }
方案2(仅针对主键属性单独指定访问策略)
如果你不想修改整个类的访问策略,可以只给主键字段单独加@Access注解,明确告诉Hibernate主键直接从字段读取,不需要调用对应getter:
import javax.persistence.Access; import javax.persistence.AccessType; @Entity @Inheritance(strategy = InheritanceType.SINGLE_TABLE) public class myEntity { @Id @Access(AccessType.FIELD) // 仅给主键字段加该注解 private String id; public ID getId() { return new ID(this.id); } // ... 其他原有代码保持不变 }
方案3(切换为属性访问策略让@Transient生效)
如果你希望方法上的@Transient生效,可以切换为PROPERTY访问策略,把@Id注解放到原始String类型主键的getter上即可:
@Entity @Inheritance(strategy = InheritanceType.SINGLE_TABLE) public class myEntity { private String id; // 新增返回String类型主键的getter,把@Id注解放到这里 @Id public String getRawId() { return this.id; } // 此时@Transient注解会生效,Hibernate会忽略该方法 @Transient public ID getId() { return new ID(this.id); } // ... 其他原有代码保持不变 }
内容的提问来源于stack exchange,提问作者Serhii
相关产品推荐
相关产品推荐

