如何使用@Query Spring JPA注释执行查询

Sal*_*zmi 1 java spring jpa

我正在尝试使用SpringData Jpa在接口方法声明上使用@Query注释编写查询.

界面如下所示:

public interface MyService {

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

我还有一个实现此接口的类:

@Component
public class ProjectServiceImpl implements ProjectService {

}
Run Code Online (Sandbox Code Playgroud)

我不确定此查询执行将如何工作以及如何在imeplementing类中为getEmployeesWorkingOnAProject方法提供实现.

谢谢

sov*_*vas 5

在您的Interface中,您应该扩展 JpaRepository(或任何其他spring数据存储库).然后你可以在任何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();
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,Spring Data能够为您构建查询,因此在此示例中没有理由编写自己的查询.

Spring Data方式:

public interface MyService extends JpaRepository<Employee,Long> {

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

}
Run Code Online (Sandbox Code Playgroud)