我正在尝试使用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方法提供实现。
由于
答案 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")