带有SpringBootApplication的JAX-RS。
我正在构建一个API,我希望用户可以在提取数据时使用过滤器。如果他们向GET请求:
http://localhost:8100/apis/employee/?firstName=john&lastName=doe
API将返回一个或多个满足这些要求的结果。 我还希望他们只使用其中一个参数(firstName或lastName)。 我能够编写代码,它工作正常,但只有两个参数,我已经有三种可能的组合(我的API上有三种查询方法)。
firstName = NULL && lastName = NULL (getAllEmployees case)
firstName != NULL && lastName = NULL
firstName = NULL && lastName != NULL
firstName != NULL && lastName != NULL
这是我在employeeResource文件上的GET方法的样子:
@GET
@QueryParam("{firstName}, {lastName}")
@Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
public Response getEmployees(@QueryParam("firstName") String firstName, @QueryParam("lastName") String lastName) {
List<Employee> employeeList;
if(firstName != null && !firstName.isEmpty() && lastName != null && !lastName.isEmpty()) {
employeeList = employeeRepository.findByFirstNameAndLastName(firstName, lastName);
}
else if(firstName != null && !firstName.isEmpty()) {
employeeList = employeeRepository.findByFirstName(firstName);
}
else if (lastName != null && !lastName.isEmpty()) {
employeeList = employeeRepository.findByLastName(lastName);
}
else {
employeeList = (List<Employee>) employeeRepository.findAll();
}
if (employeeList.size() == 0) {
return Response.status(Response.Status.NOT_FOUND).build();
}
return Response.ok(employeeList).build();
}
这就是我的employeeRepository文件的样子:
public interface EmployeeRepository extends PagingAndSortingRepository<Employee, Integer>{
List<Employee> findByFirstName(String firstName);
List<Employee> findByFirstNameAndLastName(String firstName, String lastName);
List<Employee> findByLastName(String lastName);
}
如果我添加第三个参数,可能的组合方案现在是8,所以我需要在employeeRepository
上定义8个查询函数,你可以想象如果你有10个可能的参数要搜索会发生什么。
有没有更好的方法来实现它,而不必定义所有这些方法?
我不介意写它们,我只是不想做一些不是最好的方法。
答案 0 :(得分:0)
如果您想在回购中使用更通用的查找方法,可以使用The specification pattern。这是一个article,它在java中实现了规范模式。如果您想在REST端点上使用更通用的过滤器,可以查看OData如何格式化其查询字符串过滤器。
答案 1 :(得分:0)
您可以在EmployeeRepository上编写自定义查询,如下所示
@Query(“从员工e中选择e,其中(:firstName为null或e.firstName =:firstName)AND(:lastName为null或e.lastName =:lastName)”) list findByDifferentParams(@Param(“firstName)String firstName,@ Param(”lastName)String lastName);
如果需要,您可以添加其他参数。