2017-04-20 75 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") 
相关问题