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

时间:2017-04-20 06:18:11

标签: 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;
}

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

@Component
public class ProjectServiceImpl implements ProjectService {

}

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

由于

2 个答案:

答案 0 :(得分:5)

在您的界面中,您应扩展 JpaRepository(或任何其他弹簧数据存储库)。 然后你可以在任何spring bean类中 autowire 你的接口并调用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();
    }
}

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

Spring数据方式:

public interface MyService extends JpaRepository<Employee,Long> {

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

}

答案 1 :(得分:0)

首先要做的事情。您的界面必须扩展某种Spring Data Repository,例如JpaRepository

第二件事,在Query注释中,可以放两种类型的查询。 JPQL或本机SQL查询。这可以通过查询注释(nativeQuery)上的标志来控制。

在JPQL中,您的查询应如下所示:

@Query("select e from employee e where e.projectId = ?1")