【问题标题】:Spring Boot JPA repositories custom querySpring Boot JPA 存储库自定义查询
【发布时间】:2017-07-05 12:09:28
【问题描述】:

http://spring.io/guides/gs/accessing-data-jpa/

参考上面的链接来定义一个自定义查询。

我们已经开发了一个 Spring Boot Web 服务 CRUD 应用程序,但是当我们添加自定义查询时,我们遇到了以下异常。

 org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'EmployeeController': Unsatisfied dependency expressed through field 'EmployeeService'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'EmployeeServiceImpl': Unsatisfied dependency expressed through field 'EmployeeRepository'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'EmployeeRepository': Invocation of init method failed; nested exception is org.springframework.data.mapping.PropertyReferenceException: No property name found for type Employee!
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:588) ~[spring-beans-4.3.9.RELEASE.jar:4.3.9.RELEASE]
Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'EmployeeServiceImpl': Unsatisfied dependency expressed through field 'EmployeeRepository'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'EmployeeRepository': Invocation of init method failed; nested exception is org.springframework.data.mapping.PropertyReferenceException: No property name found for type Employee!
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:588) ~[spring-beans-4.3.9.RELEASE.jar:4.3.9.RELEASE]
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'EmployeeRepository': Invocation of init method failed; nested exception is org.springframework.data.mapping.PropertyReferenceException: No property name found for type Employee!
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1628) ~[spring-beans-4.3.9.RELEASE.jar:4.3.9.RELEASE]
Caused by: org.springframework.data.mapping.PropertyReferenceException: No property name found for type Employee!
at org.springframework.data.mapping.PropertyPath.<init>(PropertyPath.java:77) ~[spring-data-commons-1.13.4.RELEASE.jar:naat org.springframework.data.mapping.PropertyPath.create(PropertyPath.java:309) ~[spring-data-commons-1.13.4.RELEASE.jar:na]
at org.springframework.data.mapping.PropertyPath.from(PropertyPath.java:272) ~[spring-data-commons-1.13.4.RELEASE.jar:na]

这是我定义的存储库接口。定义了一个自定义查询。

package com.example.rest.repository;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import com.example.rest.model.Employee;
@Repository
public interface EmployeeRepository extends JpaRepository<Employee, Long> {
Employee findByName(String employeeName);}

这是我的服务接口

package com.example.rest.service;
import java.util.List;
import com.example.rest.model.Employee;
public interface EmployeeService {

Employee save(Employee employee);
Employee getById(Long employeeId);
void delete(Long employeeId);
List<Employee> findAll();
Employee findByName(String employeeName); }

这是我的服务实现类

package com.example.rest.service;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.example.rest.model.Employee;
import com.example.rest.repository.EmployeeRepository;

@Service
public class EmployeeServiceImpl implements EmployeeService {

@Autowired
EmployeeRepository employeeRepository;

@Override
public Employee save(Employee employee) {
    // TODO Auto-generated method stub
    return employeeRepository.save(employee);
}

@Override
public Employee getById(Long employeeId) {
    // TODO Auto-generated method stub
    return employeeRepository.getOne(employeeId);
}

@Override
public void delete(Long employeeId) {
    // TODO Auto-generated method stub
    employeeRepository.delete(employeeId);
}

@Override
public List<Employee> findAll() {
    // TODO Auto-generated method stub
    return employeeRepository.findAll();
}

@Override
public Employee findByName(String employeeName) {
    // TODO Auto-generated method stub
    return employeeRepository.findByName(employeeName);
}}

如果没有自定义查询,我的应用程序可以正常工作。 让我知道我在哪里犯了错误。

我已经添加了模型类

package com.example.rest.model;

import java.io.Serializable;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name="testF")
public class Employee implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@Column(nullable=false, unique=true)
private Long employeeId;

@Column(nullable=false, unique=true)
private String employeeName;

@Column(nullable=false)
private String emailId;

@Column(nullable=false)
private Long salary;

public Employee() {
}

public Employee(Long employeeId, String employeeName, String emailId, Long salary) {
this.employeeId = employeeId;
this.employeeName = employeeName;
this.emailId = emailId;
this.salary = salary;
}

public Long getEmployeeId() {
return employeeId;
}

public void setEmployeeId(Long employeeId) {
this.employeeId = employeeId;
}

public String getEmployeeName() {
return employeeName;
}

public void setEmployeeName(String employeeName) {
this.employeeName = employeeName;
}

public String getEmailId() {
return emailId;
}

public void setEmailId(String emailId) {
this.emailId = emailId;
}

public Long getSalary() {
return salary;
}

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

@Override
public String toString() {
return "Employee [employeeId=" + employeeId + ", employeeName=" + employeeName + ", emailId=" + emailId
+ ", salary=" + salary + "]";
}

@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((employeeId == null) ? 0 : employeeId.hashCode());
return result;
}

@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Employee other = (Employee) obj;
if (employeeId == null) {
if (other.employeeId != null)
return false;
} else if (!employeeId.equals(other.employeeId))
return false;
return true;
}}

【问题讨论】:

  • 请发Employee班级代码
  • 我已经添加了模型类

标签: spring-boot repository spring-data-jpa


【解决方案1】:

您在 Employee 类中没有字段“名称”。

spring 数据尝试使用字段名称为搜索员工创建查询。

Employee findByName(String employeeName);}

【讨论】:

    【解决方案2】:

    你的模型没有name属性,你有employeeName,所以你的查询应该是这样的:

    Employee findByEmployeeName(String employeeName);
    

    有关如何构建 Spring Data 查询的更多信息,请参阅 reference。简而言之,当您要创建查询时,您必须指定完整的字段名称,它在您的实体中是如何写入的。

    【讨论】:

    • @Divi 欢迎来到 Stack Overflow。请注意,在这里说“谢谢”的首选方式是投票赞成好的问题和有用的答案(一旦你有足够的声誉这样做),并接受对你提出的任何问题最有帮助的答案(这也给出了你的声誉小幅提升)。
    【解决方案3】:

    你不能在你的自定义查询中写 findByName 因为你没有名字字段但是你可以写 EmployeeName

    【讨论】:

      猜你喜欢
      • 2017-11-15
      • 2021-04-16
      • 2021-04-01
      • 2019-06-17
      • 2017-12-03
      • 2019-07-28
      • 2018-10-06
      • 2016-08-29
      • 1970-01-01
      相关资源
      最近更新 更多