java - 向 Spring Data Repository 添加自定义功能的问题

标签 java spring-boot spring-data

我通过 CrudRepository 的内置方法获取数据,但在将自定义方法应用于数据存储库时出现错误。

这是存储库

@Repository
public interface EmployeeRepository extends CrudRepository<Employee, Integer> {
    List<Employee> findAllByEmployeeLastName(String last);
}

这是服务类

@Service
public class EmployeeService {

    private EmployeeRepository employeeRepository;

    @Autowired
    public EmployeeService(EmployeeRepository _employeeRepository) {
        employeeRepository = _employeeRepository;
    }

    public Iterable<Employee> findAll() {
        return employeeRepository.findAll();
    }

    public Employee findById(int id) {

        Optional<Employee> id_of_employee = employeeRepository.findById(id);

        Employee employee = null;

        if (id_of_employee.isPresent()) {
            employee = id_of_employee.get();
        } else {
            throw new RuntimeException("ID not found : " + id);
        }

        return employee;
    }

    public List<Employee> getEmployeeByLastName(String last) {
        return employeeRepository.findAllByEmployeeLastName(last);
    }
}

这是 Controller

@RestController
@RequestMapping("/api") public class EmployeeRestController {

    public EmployeeService employeeService;

    @Autowired
    public EmployeeRestController(EmployeeService _employeeService) {
        employeeService = _employeeService;
    }

    @GetMapping("/list_of_employees")
    public Iterable<Employee> getAllEmployees() {
        return employeeService.findAll();
    }

    @GetMapping("/find_an_employee_by_id/{id}")
    public Employee getAnEmplopyeeByID(@PathVariable int id) {
        Employee employee = employeeService.findById(id);

        if (employee == null) {
            throw new RuntimeException("ID not found : " + id);
        }

        return employee;

    }

    @RequestMapping("/find_employee_by_last_name/{last}")
    public List<Employee> getEmployeeByLastName(@PathVariable(value = "last") String last) {
        return employeeService.getEmployeeByLastName(last);
    }

}

getEmployeeByLastName() 方法是这里的自定义方法,它给出错误,我是否需要添加一些 xml 文件来运行自定义方法?或者我在其他地方出错了?非常感谢对此的任何帮助。

这是实体类

@Entity
@Table(name = "employees")
public class Employee {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;

    @Column(name = "first_name")
    private String first_name;

    @Column(name = "last")
    private String last;

    @Column(name = "salary")
    private double salary;

    @Column(name = "email")
    private String email;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getFirst_name() {
        return first_name;
    }

    public void setFirst_name(String first_name) {
        this.first_name = first_name;
    }

    public String getLast() {
        return last;
    }

    public void setLast(String last) {
        this.last= last;
    }

    public double getSalary() {
        return salary;
    }

    public void setSalary(double salary) {
        this.salary = salary;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public Employee() {
    }
}

堆栈跟踪:

[I:\spring_boot_project_factory\project_factory_1\section_1\Project\target\classes\com\project\service\EmployeeService.class]: Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'employeeRepository': Invocation of init method failed; nested exception is 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! 2019-04-19 15:02:25.321 INFO 3920 --- [ restartedMain] j.LocalContainerEntityManagerFactoryBean : Closing JPA EntityManagerFactory for persistence unit 'default' 2019-04-19 15:02:25.334 INFO 3920 --- [ restartedMain] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown initiated... 2019-04-19 15:02:25.345 INFO 3920 --- [ restartedMain] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown completed. 2019-04-19 15:02:25.348 INFO 3920 --- [ restartedMain] o.apache.catalina.core.StandardService : Stopping service [Tomcat] 2019-04-19 15:02:25.390 INFO 3920 --- [ restartedMain] ConditionEvaluationReportLoggingListener :

Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled. 2019-04-19 15:02:25.409 ERROR 3920 --- [ restartedMain] o.s.boot.SpringApplication
: Application run failed

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'employeeRestController' defined in file

最佳答案

日志中指出

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

您在EmployeeRepository中的方法名称应该是findAllByLast(String last);

此外,我建议您阅读有关 java 编码和命名约定的内容,这样您就可以避免此类错误。

关于java - 向 Spring Data Repository 添加自定义功能的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55759011/

相关文章:

java - Thrift Java 服务器 OutOfMemoryError 与 Javascript 客户端

java - 在代码中使用 db 值的正确方法是什么

java - 测试非空字段的更好方法

java - Spring数据设置实体

java - 对每个实体子类型使用不同的投影

spring - 在其中保存带有缓存对象的实体导致分离实体异常

java - LibGdx 中的 PolygonSprite 仅显示纹理的一部分。

java - swing.Timer不停止

java - 带有表单登录的 Spring Security OAuth 2

java - com.fasterxml.jackson.databind.JsonSerializer 按键排除字段