2017-04-20 32 views
1

我想在接口方法聲明中使用@Query註釋使用SpringData Jpa編寫查詢。如何使用@Query執行查詢Spring JPA註釋

界面看起來是這樣的:

public interface MyService { 

    @Query("select * from employee e where e.projectId = ?1") 
    public List<Employee> getEmployeesWorkingOnAProject(String projectId) throws MyException; 
} 

我也有一個實現此接口的類:

@Component 
public class ProjectServiceImpl implements ProjectService { 

} 

我不知道這將如何查詢執行工作,以及如何提供實現用於imeplementing類中的getEmployeesWorkingOnAProject方法。

感謝

+0

在這種情況下,你不需要'@ Query'。如果你有一個外鍵關係,只要命名你的方法'findByProjectId(String)',或者甚至'findByProject(Project)'。 – chrylis

回答

4

在你的界面,你應該擴展 JpaRepository(或任何其他彈簧數據存儲庫)。 然後,您可以只需autowire您的界面在任何spring bean類中調用getEmployeesWorkingOnAProject()。

因此,例如:

public interface MyService extends JpaRepository<Employee,Long> { 

    @Query("select * from employee e where e.projectId = ?1") 
    public List<Employee> getEmployeesWorkingOnAProject(String projectId) throws MyException; 

} 


@Component 
public class ProjectServiceImpl implements ProjectService { 

    private final MyService service; 

    @Autowire // not necessary in spring 4.3 + 
    public ProjectServiceImpl(MyService service) { 
     this.service = service; 
    } 

    public List<Employee> getEmployeesWorkingOnAProject(String projectId) throws MyException { 
     return service.getEmployeesWorkingOnAProject(); 
    } 
} 

然而,春天的數據能夠爲您構建一個查詢,因此沒有理由在這個例子中寫自己的查詢。

春數據方式:

public interface MyService extends JpaRepository<Employee,Long> { 

    public List<Employee> findAllByProjectId(String projectId) throws MyException; 

} 
+0

thnx。但是我需要在員工和項目之間定義什麼樣的關係,以便此方法名稱有效。 –

+0

我想這是不同的問題,所以你需要問新的威脅 – sovas

+0

thx隊友。感謝你的幫助 –

0

首先第一件事情。您的界面必須擴展某種Spring Data Repository,例如JpaRepository

第二件事,在查詢註釋中,可以放兩種類型的查詢。 JPQL或本機SQL查詢。這可以通過查詢註釋(nativeQuery)上的標誌來控制。

在JPQL,您的查詢應該如下所示:

@Query("select e from employee e where e.projectId = ?1") 
相關問題