【发布时间】:2020-05-31 12:26:34
【问题描述】:
我的 JPA 存储库位于代码中,该存储库具有多个 findByColumn 方法以进行快速查找。
很少有带有多个列的 findBy 子句,例如 findByColumn1AndColumn2AndColumn3 以及更多类似或组合的多个列,例如提到的。
我的问题是目前我希望我的客户对所有选择/获取操作只使用一个端点,这些操作期望每列的 RequestParam 并且如果他没有在请求端点上输入任何预期的列值,我将默认设置为“NA " 并且我使用 if 子句来识别所有传入的字段参数,然后调用受尊重的存储库端点。
我现在的问题是由于在同一个端点请求中添加多个新列,如果我的 if 子句变得疯狂,我相信足够的代码对于其他团队成员来说不会是用户友好的阅读。
任何人都可以建议如何在 spring boot 应用程序上实现这个动态查询部分。
我的控制器代码 sn-p 如下所示:
@GetMapping("/getdata")
public ResponseEntity<Page<PojoTbl>> getDataFromDB(
@PageableDefault(page = 0, size = 20) @SortDefault.SortDefaults({
@SortDefault(sort = "id", direction = Sort.Direction.DESC) }) Pageable pageable,
@RequestParam(value = "col1", required = false, defaultValue = "NA") String col1,
@RequestParam(value = "col2", required = false, defaultValue = "NA") String col2,
@RequestParam(value = "col3", required = false, defaultValue = "NA") String col3,
@RequestParam(value = "col4", required = false, defaultValue = "NA") String col4,
@RequestParam(value = "col5", required = false, defaultValue = "NA") String col5,
@RequestParam(value = "col6", required = false, defaultValue = "NA") String col6,
@RequestParam(value = "col7", required = false, defaultValue = "NA") String col7,
@RequestParam(value = "col8", required = false, defaultValue = "NA") String col8,
@RequestParam(value = "id", required = false) Long id) {
Page<PojoTbl> selectedRecords = myService.findDataFromDB(col1,
col2, col3, col4, col5, col6, col7, id,
col8, pageable);
return ResponseEntity.ok(selectedRecords);
}
后端服务层同样的样子是这样的:
public Page<PojoTbl> findDataFromDB(String col1, String col2,
String col3, String col4, String col5, String col6,
String col7, Long id, String col8, Pageable pageable) {
Page<PojoTbl> selectedRecords = null;
if (col1.equals("NA") && col2.equals("NA") && col3.equals("NA")
&& col4.equals("NA") && col6.equals("NA") && col7.equals("NA")
&& Objects.isNull(id) && col5.equals("NA") && col8.equals("NA")) {
selectedRecords = tableJpaRepository.findAll(pageable);
} else if (col1.equals("NA") && col2.equals("NA") && col3.equals("NA")
&& col4.equals("NA") && col6.equals("NA") && col7.equals("NA")
&& Objects.isNull(id) && col5.equals("NA") && !col8.equals("NA")) {
selectedRecords = tableJpaRepository.findBycol8IgnoreCase(col8, pageable);
} else if (!col1.equals("NA") && col2.equals("NA") && col3.equals("NA")
&& col4.equals("NA") && col6.equals("NA") && col7.equals("NA")
&& Objects.isNull(id) && col5.equals("NA") && col8.equals("NA")) {
selectedRecords = tableJpaRepository.findBycol1IgnoreCase(col1, pageable);
} else if (col1.equals("NA") && col2.equals("NA") && col3.equals("NA")
&& col4.equals("NA") && col6.equals("NA") && col7.equals("NA")
&& Objects.isNull(id) && !col5.equals("NA") && col8.equals("NA")) {
selectedRecords = tableJpaRepository.findBycol5IgnoreCase(col5, pageable);
} else if (col1.equals("NA") && !col2.equals("NA") && col3.equals("NA")
&& col4.equals("NA") && col6.equals("NA") && col7.equals("NA")
&& Objects.isNull(id) && col5.equals("NA") && col8.equals("NA")) {
selectedRecords = tableJpaRepository.findBycol2IgnoreCase(col2, pageable);
} else if (col1.equals("NA") && col2.equals("NA") && col3.equals("NA")
&& col4.equals("NA") && !col6.equals("NA") && col7.equals("NA")
&& Objects.isNull(id) && col5.equals("NA") && col8.equals("NA")) {
selectedRecords = tableJpaRepository.findBycol6IgnoreCase(col6, pageable);
} else if (col1.equals("NA") && col2.equals("NA") && col3.equals("NA")
&& col4.equals("NA") && col6.equals("NA") && !col7.equals("NA")
&& Objects.isNull(id) && col5.equals("NA") && col8.equals("NA")) {
selectedRecords = tableJpaRepository.findBycol7IgnoreCase(col7, pageable);
} else if (col1.equals("NA") && col2.equals("NA") && col3.equals("NA")
&& col4.equals("NA") && col6.equals("NA") && col7.equals("NA")
&& !Objects.isNull(id) && col5.equals("NA") && col8.equals("NA")) {
selectedRecords = tableJpaRepository.findById(id, pageable);
} else if (!col1.equals("NA") && !col2.equals("NA") && col3.equals("NA")
&& col4.equals("NA") && col6.equals("NA") && col7.equals("NA")
&& Objects.isNull(id) && col5.equals("NA") && col8.equals("NA")) {
selectedRecords = tableJpaRepository.findBycol1Andcol2IgnoreCase(col1, col2,
pageable);
} else if (!col1.equals("NA") && !col2.equals("NA") && col3.equals("NA")
&& col4.equals("NA") && col6.equals("NA") && col7.equals("NA")
&& Objects.isNull(id) && !col5.equals("NA") && col8.equals("NA")) {
selectedRecords = tableJpaRepository.findBycol1Andcol2Andcol5IgnoreCase(col1,
col2, col5, pageable);
} else if (!col1.equals("NA") && !col2.equals("NA") && col3.equals("NA")
&& col4.equals("NA") && !col6.equals("NA") && col7.equals("NA")
&& Objects.isNull(id) && col5.equals("NA") && col8.equals("NA")) {
selectedRecords = tableJpaRepository.findBycol1Andcol2Andcol6IgnoreCase(col1,
col2, col6, pageable);
} else if (!col1.equals("NA") && !col2.equals("NA") && col3.equals("NA")
&& col4.equals("NA") && !col6.equals("NA") && !col7.equals("NA")
&& Objects.isNull(id) && col5.equals("NA") && col8.equals("NA")) {
selectedRecords = tableJpaRepository
.findBycol1Andcol2Andcol6Andcol7IgnoreCase(col1, col2,
col6, col7, pageable);
} else if (!col1.equals("NA") && !col2.equals("NA") && !col3.equals("NA")
&& !col4.equals("NA") && !col6.equals("NA") && col7.equals("NA")
&& Objects.isNull(id) && !col5.equals("NA") && col8.equals("NA")) {
selectedRecords = tableJpaRepository
.findBycol1Andcol2Andcol3Andcol4Andcol6IgnoreCase(
col1, col2, col3, col4, col6, pageable);
} else if (!col1.equals("NA") && !col2.equals("NA") && !col3.equals("NA")
&& !col4.equals("NA") && col6.equals("NA") && col7.equals("NA")
&& Objects.isNull(id) && !col5.equals("NA") && col8.equals("NA")) {
selectedRecords = tableJpaRepository
.findBycol1Andcol2Andcol3Andcol4Andcol5IgnoreCase(
col1, col2, col3, col4, col5, pageable);
}
return selectedRecords;
}
查看我在服务层中创建的复杂性,这将在未来的版本中产生问题,因为代码看起来很混乱,因为单个 if 语句中的许多检查。
希望有人可以指导我了解可以降低代码复杂性的最佳实践。
【问题讨论】:
-
谢谢我正在调查它
-
我已经在这里stackoverflow.com/questions/60243712/…回答了类似的问题
标签: java spring spring-boot spring-data-jpa