Spring Data JPA @Query报错:Param类型无findAllServices属性
解决Spring Data JPA自定义查询报错问题
错误原因
报错信息:
Failed to create query for method public abstract java.util.List com.myapp.repository.ParamRepository.findAllServices()! No property findAllServices found for type 'Param'
问题出在ParamRepository的@Query注解参数使用错误:你用了name属性编写原生SQL,但name属性的作用是指定预定义命名查询的名称(比如实体类上@NamedQuery定义的名称),而非直接传入SQL语句。正确应该使用value属性(或省略属性名,因为value是@Query的默认属性)来传入SQL。
修正后的Repository代码
import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.stereotype.Repository; import java.util.List; @Repository public interface ParamRepository extends JpaRepository<Param, Long> { // 修正:使用value属性传入原生SQL,nativeQuery=true指定为原生查询 @Query(value = "SELECT DISTINCT p.* FROM param p INNER JOIN student_service pa ON p.name = pa.service", nativeQuery = true) List<Param> findAllServices(); }
额外注意事项
- 实体类注解修正:Param和Student实体类的
@Table注解漏了@符号,必须补全:// Param类修正 @Table(name = "param") public class Param implements Serializable { // ... 原有代码 } // Student类修正 @Table(name = "student") public class Student implements Serializable { // ... 原有代码 } - 属性封装规范:Param类的
name字段是public,建议改为private并添加getter方法,符合JPA规范和Java封装原则:@Table(name = "param") public class Param implements Serializable { // ... 原有代码 private String name; // 改为private // 添加getter public String getName() { return name; } }
内容的提问来源于stack exchange,提问作者dbh
相关产品推荐
相关产品推荐

