簡體   English   中英

為什么 jpa 自定義查詢返回更多結果

[英]Why jpa custom query returns more results

Spring 引導在 memory DB H2 中。 它有表格和以下數據: -

    [
    {
        "id": 1,
        "firstName": "Lokesh",
        "lastName": "Gupta",
        "email": "howtodoinjava@gmail.com"
    },
    {
        "id": 2,
        "firstName": "John",
        "lastName": "Doe",
        "email": "xyz@email.com"
    }
]

這是我的存儲庫,帶有自定義 jpa 查詢:-

@Repository
public interface EmployeeRepository extends JpaRepository<EmployeeEntity, Long> {

    @Query("SELECT e FROM EmployeeEntity e WHERE e.firstName like firstName")
    List<EmployeeEntity> findByFirstName(@Param("firstName") String firstName);

    @Query("SELECT e FROM EmployeeEntity e WHERE e.id = id")
    EmployeeEntity findById2(@Param("id") long id);

}

服務有以下兩種方法:-

    public EmployeeEntity getEmployeeById2(Long id)  {
    EmployeeEntity employee = repository.findById2(id);
    return employee;
}

public List<EmployeeEntity> findByFirstName(String firstName){
    List<EmployeeEntity> employeeEntities = repository.findByFirstName(firstName);
    return employeeEntities;
}

Controller 有這個:-

@GetMapping("/{id}")
public ResponseEntity<EmployeeEntity> getEmployeeById(@PathVariable("id") Long id)
        throws RecordNotFoundException {
    EmployeeEntity entity = service.getEmployeeById2(id);

    return new ResponseEntity<EmployeeEntity>(entity, new HttpHeaders(), HttpStatus.OK);
}

@GetMapping(value = "/fname/{firstName}")
public List<EmployeeEntity> findByFirstName(@PathVariable("firstName") String firstName){
    return service.findByFirstName(firstName);
}

當我調用 findByFirstName 時。 我得到了兩個EmployeeEntity。

當我調用 getEmployeeById 時。 我收到錯誤:-

“狀態”:500,“錯誤”:“內部服務器錯誤”,“消息”:“查詢沒有返回唯一結果:2;嵌套異常是 javax.persistence.NonUniqueResultException:查詢沒有返回唯一結果:2” ,

我不知道如何正確編寫 jap 自定義查詢,以便返回正確的結果。 如何僅按名字獲得 1 名員工或僅按 id 獲得 1 名員工?

在不測試您的代碼的情況下,嘗試使用它,

@Repository
public interface EmployeeRepository extends JpaRepository<EmployeeEntity, Long> {

    @Query("SELECT e FROM EmployeeEntity e WHERE e.firstName like :firstName")
    List<EmployeeEntity> findByFirstName(@Param("firstName") String firstName);

    @Query("SELECT e FROM EmployeeEntity e WHERE e.id = :id")
    EmployeeEntity findById2(@Param("id") long id);

}

我在您的 JPQL 變量之前添加了一個字符:

查詢中的命名參數缺少冒號。 它應該是:

@Query("SELECT e FROM EmployeeEntity e WHERE e.firstName like :firstName")
List<EmployeeEntity> findByFirstName(@Param("firstName") String firstName);

@Query("SELECT e FROM EmployeeEntity e WHERE e.id = :id")
EmployeeEntity findById2(@Param("id") long id);

暫無
暫無

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

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