jpa Rest API设计用于在一个端点或尽可能少的端点中处理多个可选参数

gojuced7  于 2023-04-30  发布在  其他
关注(0)|答案(1)|浏览(106)

我们希望设计带有端点的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.

np8igboo

np8igboo1#

我认为你应该用动态过滤和排序来实现单端点。例如,您的端点应该使用类似于以下内容的内容:

{
  "filters": [
    {
      "operation": "eq",
      "field:": "EmployeeId",
      "value": "123",
      "valueType": "long"
    },
    {
      "operation": "like",
      "field:": "CurrentTitle",
      "value": "title",
      "valueType": "string"
    }
  ],
  "sorts": [
    {
      "field": "EmployeeId",
      "direction": "asc"
    }
  ]
}

您预先定义了一组可能的操作(eq、gt、like、between等)。)并将其Map到JPA Criteria API。这应该保持过滤查询相对简单,并适应数据库模式的变化。此外,您可以将筛选器加入到组中,以引入更复杂的筛选逻辑。

相关问题