即使我认为一切看起来还不错,我也遇到了一个奇怪的错误。
宠物类:
@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的财产所有者
为什么会出现此错误?
答案 0 :(得分:2)
由于您将字段命名为petOwner
,因此您应使用findByPetOwner
方法名称而不是findByOwner
:
@Repository
public interface PetRepository extends JpaRepository<Pet, Long> {
List<Pet> findByPetOwner(PetOwner owner);
}
Spring Data JPA尝试从查询方法名称构建特定于商店的查询。一般方法是从方法名称中删除一组已知的前缀(例如find...By
或get...By
),并使用Property Expressions
解析方法的其余部分(例如{{1} (在您的情况下)和petOnwer
的集合,如Clauses
,Top
,Distinct
。这些属性表达式只能引用托管实体的直接属性。在您的情况下,由于您的媒体资源名称为OrderBy
,因此您无法使用petOwner
或owner
以外的任何内容。您可以阅读有关此概念的更多信息here。