Spring启动报UnsatisfiedDependencyException JPA自定义查询方法初始化失败
问题原因和解决方法
核心错误原因
报错提示No property name found for type Produs!是两个核心问题导致的:
- JPA查询方法名和实体类字段不匹配:你的
Product实体类中存储商品名称的字段是produs,但你写的Repository方法为findByNameStartingWith,Spring Data JPA会按照方法名去匹配实体类中的name字段,找不到就会抛出初始化异常。 - Repository方法入参类型错误:
findByXXXStartingWith是前缀匹配查询,入参应该是要匹配的前缀字符串,而不是你写的List<Product>类型。
具体修复步骤
第一步:修正ProductRepository代码
调整方法名匹配实体字段,同时修改入参类型:
@Repository public interface ProductRepository extends JpaRepository<Product, Integer> { // 方法名对应实体的produs字段,入参为要匹配的前缀字符串 List<Product> findByProdusStartingWith(String prefix); }
第二步:修正ProductService接口和实现类
同步调整方法定义和调用逻辑:
- ProductService接口:
public interface ProductService { List<Product> findByProdusStartingWith(String prefix); // 补全你Controller中用到的findAll方法定义 List<Product> findAll(); }
- ProductServiceImpl实现类:
@Service public class ProductServiceImpl implements ProductService { ProductRepository productRepository; public ProductServiceImpl(ProductRepository productRepository) { this.productRepository = productRepository; } @Override public List<Product> findByProdusStartingWith(String prefix) { return productRepository.findByProdusStartingWith(prefix); } @Override public List<Product> findAll() { return productRepository.findAll(); } }
第三步:修正ProductController逻辑
你当前Controller存在两个无效操作:@Query注解只能作用在Repository方法上,不能加在Controller接口上;自己循环过滤查询结果的逻辑完全冗余,直接调用JPA封装的查询方法即可:
@RequestMapping("/api") @RestController public class ProductController { private final ProductService productService; public ProductController(ProductService productService) { this.productService = productService; } @GetMapping("findProductbyNameStartingWith/produs") public List<Product> findProductsbyNameStartingWith(@Param("name") String beginswith) { return productService.findByProdusStartingWith(beginswith); } }
同类问题排查思路
遇到QueryCreationException报错时,优先检查三点:
- JPA查询方法名对应的属性名,是否和实体类字段完全匹配,注意大小写和驼峰命名规则
- 方法的入参类型、数量是否和查询逻辑要求一致
- 实体类对应字段是否存在拼写错误、是否加了正确的JPA持久化注解
内容的提问来源于stack exchange,提问作者Marcel
相关产品推荐
相关产品推荐

