我们希望设计带有端点的Rest API,该端点可以处理多个可选参数,并基于传递的参数,使用JPA在数据库中搜索并取回结果。例如,假设数据库中有一个Employee表,其中包含列
EmployeeId, JoiningDate, Salary, CurrentTitle, TimeInCurrentTitle and may be few more columns.
对于某些列,也可以有多种方法来搜索e。g的。Fetch all employees with JoiningDate as 2022-05-04
or fetch all employees who joined after 2022-05-04
工资也一样get all employees having Salary as $80000
or get all employees having salary greater than $80000
一种方法是为每列设计单个端点。在DAO层,我们尝试使用JPA从数据库中获取结果
EmployeeId -> findByEmployeeId will get the result for that id from database
JoiningDate -> findByJoiningDate will get all the empolyees who joined on that date
AfterJoiningDate -> findByJoiningDateGreaterThan will get all the employees who joined after given date
BetweenJoiningDate -> findByJoiningDateBetween will get all the employess who joined between given date A and given date B
我们有大约10列左右,用户可以使用这些列进行搜索,在某些列中,也可以有多个选项进行搜索,正如我上面所描述的日期和数字列。我们还希望在检索结果时添加分页和排序功能。
如果我们在rest API中将资源设计为Employee,我们可以接受输入为
http://context-root.com/v1/employee?id=123
http://context-root.com/v1/employee?id=123&joiningDate=2022-05-04
等等,但无法思考如何从业务逻辑层简化它,在业务逻辑层,我们需要根据收到的输入调用适当的后端方法,而不编写太多的if else条件,这肯定会增加圈复杂度,也使代码难以阅读。
我们不想创建太多的端点来简化它,所以试图了解是否有更好的方法来实现这种方法,这样我们就可以最大限度地减少我们需要公开的端点数量,同时仍然获得所需的结果,并保持代码的可读性。
Pls advice.
1条答案
按热度按时间np8igboo1#
我认为你应该用动态过滤和排序来实现单端点。例如,您的端点应该使用类似于以下内容的内容:
您预先定义了一组可能的操作(eq、gt、like、between等)。)并将其Map到JPA Criteria API。这应该保持过滤查询相对简单,并适应数据库模式的变化。此外,您可以将筛选器加入到组中,以引入更复杂的筛选逻辑。