簡體   English   中英

JpaRepository 中自定義本機查詢,自定義名稱拋出 QueryCreationException

[英]Custom Native Query in JpaRepository with a custom name throwing QueryCreationException

我在一個非常微不足道的問題上停留了 2 天。 我正在創建一個帶有 Rest 端點的 spring 引導項目。 有 2 個實體類 - Employee 和 Address 具有 OneToMany 映射,其中 1 名員工具有地址列表。 我創建了一個 EmployeeRepository class,它實現了 JpaRepository 以執行與員工相關的交易。 所以需要通過地址 id 獲取員工,所以根據我的理解,如果我們必須創建自己的自定義查詢,而 JpaRepository 沒有提供,我們需要在查詢方法上方使用 @Query 注釋。 該方法可以命名為任何名稱 - 我將其命名為 - getByAddress 我在這里面臨問題。 員工 class 的地址列表如下 -

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

現在每當我試圖通過在 Url 中傳遞 Integer 地址 id 來獲取員工時,它說,期待 URL 中的地址,我懷疑這是因為我已經命名了方法 - getByAddress。 所以我將名稱更改為getByAddrId

這會引發異常-

org.springframework.beans.factory.BeanCreationException:在 com.shweta.rest.repository.EmployeeRepository 中定義的名為“employeeRepository”的 bean 在 SpringRestApplication 上聲明的 @EnableJpaRepositories 中定義時出錯:Invocation of init 方法失敗; 嵌套異常是 org.springframework.data.repository.query.QueryCreationException:無法為公共摘要 com.shweta.rest.entity.Employee com.shweta.rest.repository.EmployeeRepository.getByAddr 創建查詢: 無法為方法 public abstract com.shweta.rest.entity.Employee com.shweta.rest.repository.EmployeeRepository;getByAddrId(int) 創建查詢。 找不到類型“Employee”的屬性“addrId”。嵌套異常是 java.lang.IllegalArgumentException。 無法為方法 public abstract com.shweta.rest.entity.Employee com.shweta.rest.repository.EmployeeRepository.getByAddrId(int) 創建查詢! 找不到類型“員工”的屬性“addrId”!

由以下原因引起:org.springframework.data.repository.query.QueryCreationException:無法為公共摘要 com.shweta.rest.entity.Employee com.shweta.rest.repository.EmployeeRepository.getByAddr 創建查詢: 無法為方法 public abstract com.shweta.rest.entity.Employee com.shweta.rest.repository.EmployeeRepository;getByAddrId(int) 創建查詢。 找不到類型“Employee”的屬性“addrId”。嵌套異常是 java.lang.IllegalArgumentException。 無法為方法 public abstract com.shweta.rest.entity.Employee com.shweta.rest.repository.EmployeeRepository.getByAddrId(int) 創建查詢! 找不到類型“員工”的屬性“addrId”!

我現在非常困惑,我們可以提供自定義查詢方法名稱,那么為什么它將我的方法名稱視為 Employee class 中的一個字段,它當然無法找到,因為我的 Employee class 中沒有像 getByAddrId 這樣的字段。

看看我下面的課程:

我的員工 class:

在此處輸入圖像描述

我的地址 class :

在此處輸入圖像描述

Controller 片段:

/**
 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<Employee, Integer> {

  //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 存儲庫中保留了一些方法。

您能否嘗試將存儲庫方法更改為新名稱,例如

獲取我的員工

我還看到查詢未關閉)。

我發現了問題:

在 EmployeeRepository.java 中,不是在 @Query 中給出“名稱”,而是給出“值”屬性,這導致了所有問題。 在我將它固定為值后,它工作正常,所以下面的片段是正確的

@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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM