Spring Data JPA外键查询报错No property found该如何解决?
问题原因分析
- 核心错误1:
@Query注解属性使用错误:你将查询语句写在了name属性中,但@Query里用来指定查询内容的是value属性。Spring Data JPA未读取到自定义查询,就按照方法名findAllByDoc自动生成查询逻辑,尝试在Appointment实体类中查找名为doc的属性,匹配失败就抛出了对应报错。 - 错误2:开启
nativeQuery = true代表使用原生SQL查询,但你写的a.doctor_id.doctorid是JPQL的实体属性关联写法,原生SQL需要匹配数据库表的实际字段,不能直接用实体属性关联语法。 - 隐藏小问题:实体类属性命名不符合Java规范,
doctor_id、App_id带下划线容易导致Spring Data解析属性名时出现歧义,且int类型的主键不需要加@NotBlank注解(该注解仅用于字符串校验)。
修复方案
方案1:使用JPQL查询(推荐,无需适配数据库字段)
修改Repository层代码,改用value属性放查询语句,关闭原生SQL配置:
public interface AppointmentRepository extends JpaRepository<Appointment, Integer> { @Query(value = "select a from Appointment a where a.doctor_id.doctorid = :id") List<Appointment> findAllByDoc(int id); }
如果后续将Appointment类的关联属性改为驼峰命名private Doctor doctor;,只需要把查询语句调整为a.doctor.doctorid = :id即可。
方案2:使用原生SQL查询
如果需要用原生SQL,直接匹配数据库表字段写语句即可:
public interface AppointmentRepository extends JpaRepository<Appointment, Integer> { // appointments表的外键字段是doctor_id,直接匹配参数即可 @Query(value = "select * from appointments a where a.doctor_id = :id", nativeQuery = true) List<Appointment> findAllByDoc(int id); }
可选优化建议
- 实体类属性统一改为驼峰命名:
Appointment类中把private Doctor doctor_id;改为private Doctor doctor;,@JoinColumn(name = "doctor_id")保留不变即可(对应数据库字段名);主键private @NotBlank int App_id;改为private int appId;,数值类型主键如果需要非空校验改用@NotNull注解。 - 方法名可以调整为符合Spring Data命名规范的
findAllByDoctorDoctorid,不需要加@Query注解就能自动生成查询逻辑,前提是已经把关联属性名改为doctor。
内容的提问来源于stack exchange,提问作者swapnil
相关产品推荐
相关产品推荐

