Spring Data Repository自定义查询方法报错求助
嘿,我来帮你搞定这个问题!先看你给出的报错核心信息:
java.lang.IllegalArgumentException: Failed to create query for method public abstract java.util.List com.project.repository.EmployeeRepository.findByEmployeeLastName(java.lang.String)! No property employeeLastName found for type Employee!
这个错误已经说得很清楚了——Spring Data JPA在你的Employee实体类里找不到叫employeeLastName的属性,所以没法生成对应的查询语句。
问题根源
你的Employee实体类中,姓氏对应的字段是last(看这段代码):
@Column(name = "last") private String last;
但你在仓库接口里定义的方法是findAllByEmployeeLastName,按照Spring Data JPA的方法命名规则,它会试图去匹配实体类里的employeeLastName属性,可你的实体里根本没有这个属性,自然就报错了。
解决方案
你有两种方式解决这个问题,不需要额外添加XML文件(Spring Data JPA完全支持无XML的自定义查询):
方案1:修正方法名,匹配实体属性
直接把仓库方法名改成和实体属性last匹配的格式,Spring Data JPA会自动生成正确的查询SQL:
@Repository public interface EmployeeRepository extends CrudRepository<Employee, Integer> { // 把findAllByEmployeeLastName改成findAllByLast List<Employee> findAllByLast(String last); }
记得同步修改Service类里的调用:
public List<Employee> getEmployeeByLastName(String last) { return employeeRepository.findAllByLast(last); }
方案2:用@Query注解手动指定查询语句
如果你想保留findAllByEmployeeLastName这个方法名(比如为了语义更清晰),可以用@Query注解直接写JPQL或者SQL语句:
@Repository public interface EmployeeRepository extends CrudRepository<Employee, Integer> { @Query("SELECT e FROM Employee e WHERE e.last = ?1") List<Employee> findAllByEmployeeLastName(String last); }
这样Spring Data JPA就会按照你指定的语句执行查询,不再依赖方法名匹配属性。
补充说明
你完全不需要添加XML文件来运行自定义方法,Spring Data JPA的自定义查询主要靠方法命名规则和**@Query注解**这两种方式,XML配置只是可选的扩展方案,不是必须的。
内容的提问来源于stack exchange,提问作者user10767069

