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

时间:2016-02-17 14:53:54

标签: spring jpa spring-data spring-data-jpa

即使我认为一切看起来还不错,我也遇到了一个奇怪的错误。

宠物类:

@Entity
public class Pet {

    @Id
    @GeneratedValue
    private long id;
    ....
    @ManyToOne(cascade = CascadeType.PERSIST)
    @JoinColumn(name = "owner_id")
    private PetOwner 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:错误   创建名为&#39; petRepository&#39;的bean:调用init方法   失败;嵌套异常是   org.springframework.data.mapping.PropertyReferenceException:没有   找到类型Pet的财产所有者

为什么会出现此错误?

1 个答案:

答案 0 :(得分:2)

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

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

Spring Data JPA尝试从查询方法名称构建特定于商店的查询。一般方法是从方法名称中删除一组已知的前缀(例如find...Byget...By),并使用Property Expressions解析方法的其余部分(例如{{1} (在您的情况下)和petOnwer的集合,如ClausesTopDistinct。这些属性表达式只能引用托管实体的直接属性。在您的情况下,由于您的媒体资源名称为OrderBy,因此您无法使用petOwnerowner以外的任何内容。您可以阅读有关此概念的更多信息here