JpaRepository 接口 - 未找到 属性 所有者

JpaRepository Interface - No property owner found

尽管我认为一切正常,但我遇到了一个奇怪的错误。

宠物class:

@Entity
public class Pet {

    @Id
    @GeneratedValue
    private long id;
    ....
    @ManyToOne(cascade = CascadeType.PERSIST)
    @JoinColumn(name = "owner_id")
    private PetOwner petOwner;
}

宠物主人

@Entity(name = "pet_owner")
public class PetOwner extends User{
     ...
    @OneToMany(cascade = CascadeType.ALL,mappedBy = "petOwner")
    private List<Pet> pets;
}

宠物仓库

@Repository
public interface PetRepository extends JpaRepository<Pet, Long> {
    List<Pet> findByOwner(PetOwner owner);
}

如您所见,我想获得一份动物清单,供主人使用。在申请期间 运行 得到错误:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'petRepository': Invocation of init method failed; nested exception is org.springframework.data.mapping.PropertyReferenceException: No property owner found for type Pet!

为什么会出现这个错误?

由于您将字段命名为 petOwner,您应该使用 findByPetOwner 方法名称而不是 findByOwner:

@Repository
public interface PetRepository extends JpaRepository<Pet, Long> {
    List<Pet> findByPetOwner(PetOwner owner);
}

Spring Data JPA 尝试从查询方法名称 构建特定于商店的查询。一般的方法是从方法名称中删除一组给定的众所周知的前缀(例如 find...Byget...By)并使用 Property Expressions(例如 [=17] 解析方法的其余部分=],在你的情况下)和一组 Clauses,如 TopDistinctOrderBy。那些 属性 表达式只能引用被管理实体 的 直接 属性。在你的情况下,因为你的 属性 名称是 petOwner,你不能使用 ownerpetOwner 以外的任何东西。您可以阅读有关此概念的更多信息 here