JpaRepository 中自定义本机查询,自定义名称抛出 QueryCreationException

Custom Native Query in JpaRepository with a custom name throwing QueryCreationException

我在一个非常琐碎的问题上卡了 2 天。 我正在使用 Rest endpoints 创建一个 spring 引导项目。有 2 个实体 classes - 具有 OneToMany 映射的员工和地址,其中 1 个员工有一个地址列表。 我创建了一个 EmployeeRepository class,它实现了 JpaRepository 以执行与员工相关的交易。所以需要通过地址 id 获取员工,所以根据我的理解,如果我们必须创建自己的自定义查询,而 JpaRepository 没有提供,我们需要在查询方法上方使用 @Query 注释。该方法可以任意命名 - 我已将其命名为 - getByAddress。我在这里面临问题。员工 class 的地址列表类似于 -

@OneToMany
    @JoinColumn(name = "eId", referencedColumnName = "empId")
    List<Address> address;

现在每当我试图通过在 Url 中传递整数地址 id 来获取员工时,它说,期待 URL 中的地址,我怀疑这是因为我有将该方法命名为 - getByAddress。所以我把名字改成了getByAddrId.

这会引发异常 -

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'employeeRepository' defined in com.shweta.rest.repository.EmployeeRepository defined in @EnableJpaRepositories declared on SpringRestApplication: Invocation of init method failed; nested exception is org.springframework.data.repository.query.QueryCreationException: Could not create query for public abstract com.shweta.rest.entity.Employee com.shweta.rest.repository.EmployeeRepository.getByAddrId(int)! Reason: Failed to create query for method public abstract com.shweta.rest.entity.Employee com.shweta.rest.repository.EmployeeRepository.getByAddrId(int)! No property 'addrId' found for type 'Employee'!; nested exception is java.lang.IllegalArgumentException: Failed to create query for method public abstract com.shweta.rest.entity.Employee com.shweta.rest.repository.EmployeeRepository.getByAddrId(int)! No property 'addrId' found for type 'Employee'!

Caused by: org.springframework.data.repository.query.QueryCreationException: Could not create query for public abstract com.shweta.rest.entity.Employee com.shweta.rest.repository.EmployeeRepository.getByAddrId(int)! Reason: Failed to create query for method public abstract com.shweta.rest.entity.Employee com.shweta.rest.repository.EmployeeRepository.getByAddrId(int)! No property 'addrId' found for type 'Employee'!; nested exception is java.lang.IllegalArgumentException: Failed to create query for method public abstract com.shweta.rest.entity.Employee com.shweta.rest.repository.EmployeeRepository.getByAddrId(int)! No property 'addrId' found for type 'Employee'!

我现在很困惑,我们可以提供自定义查询方法名称,那么为什么它将我的方法名称视为 Employee class 中的一个字段,它当然无法找到,因为没有像 getByAddrId 这样的字段在我的员工 class.

看看下面我的 classes :

我的员工class:

我的地址class:

控制器片段:

/**
 To get Employee by address id
 */
@GetMapping("/getEmployeeByAddressId/{id}")
public ResponseEntity<Employee> getEmployeebyAddressId(@PathVariable("id") int id){
    return new ResponseEntity<Employee>(empService.getEmployeebyAddressId(id), HttpStatus.FOUND);
}

我的服务 class 方法从 EmployeeRepository 调用自定义查询方法:

 @Override 
  public Employee getEmployeebyAddressId(int id) 
  { 
      Employee emp = employeeRepository.getByAddrId(id); 
      return emp; 
  }

我的 JpaRepository class 具有带有自定义查询的自定义方法(查询在 MySQL 中工作正常):

@Repository

public interface EmployeeRepository extends JpaRepository {

  //Native Query
  @Query(
  name="select * from tb_employee where emp_id = (select e_id from tb_address where addr_id=?1 ", nativeQuery = true) 
  Employee getByAddrId(int id);
  

请帮助我,由于这个障碍,我无法继续前进,我的要求是创建一个自定义查询方法来 运行 任何复杂的查询

在 spring jpa 存储库中保留了一些方法。

能否尝试将存储库方法更改为新名称,例如

getMyEmployee

我还看到查询没有关闭)。

我发现了问题:

In EmployeeRepository.java ,而不是在 @Query 中给出 'name' , 'value' attribute was to be given which is caused all the issues .在我将它固定为 value 之后,它工作正常,所以下面的片段是正确的

@Query(
  value="select * from tb_employee where emp_id = (select e_id from tb_address where addr_id=?1) ", nativeQuery = true) 
  Employee getByAddrId(int id);