为什么JPA Repository接口声明getAll方法会提示未找到Department类对应属性
报错原因
这个异常是Spring Data JPA 的查询方法命名规则校验不通过导致的,具体逻辑如下:
- Spring Data JPA 对自定义查询方法有固定的命名规范,支持的查询前缀包括
find、read、get、query等,前缀之后需要拼接By+实体类属性名作为查询条件。 - 当你声明
getAll()方法时,框架会将get识别为查询前缀,把剩余的All判定为要查询的实体属性,去Department实体类中查找名为all的字段或对应的getter方法,你的实体中不存在该属性,就直接抛出No property getAll found for type Department!的异常。 - 你代码里其他方法比如
findOneById、findAllByNameOrDescriptionContains都符合命名规则:find是前缀,后面跟着的OneById、AllByNameOrDescriptionContains都是基于实体存在的属性拼接的查询条件,所以能正常生成SQL,不会报错。
解决方案
如果你需要查询所有Department数据,有三种可行方案:
- 直接调用父接口
JpaRepository已经内置的findAll()方法,不需要在自定义Repository中重复声明,直接注入后调用即可。 - 调整自定义方法名符合命名规范:改成
getAllBy(),后缀加By且不拼接任何查询条件,框架就会识别为查询全表数据。 - 给
getAll()方法添加@Query注解手动指定查询语句,绕过方法名规则校验:
@Query("SELECT d FROM Department d") List<Department> getAll();
内容的提问来源于stack exchange,提问作者Zukaru
相关产品推荐
相关产品推荐

