[英]Writing search APIs based on different combination of search params in Spring boot application
我為我的 spring-boot 應用程序開發了以下三個 API:
@GetMapping(value = "/state-transitions/searchWithFromState")
public ResponseEntity<List<TcStateTransitionDTO>>
searchWithFromState(
@RequestParam(value = "fromStateId") String fromStateId) {
return ResponseEntity.ok(stateTransitionService.findByFromState(fromStateId));
}
@GetMapping(value = "/state-transitions/searchWithFromStateAndToState")
public ResponseEntity<List<TcStateTransitionDTO>>
searchWithFromStateAndToState(
@RequestParam(value = "fromStateId") String fromStateId,
@RequestParam(value = "toStateId") String toStateId) {
return ResponseEntity.ok(stateTransitionService
.findByFromStateAndToState(fromStateId, toStateId));
}
@GetMapping(value = "/state-transitions/searchWithFromStateAndAction")
public ResponseEntity<List<TcStateTransitionDTO>>
searchWithFromStateAndAction(
@RequestParam(value = "fromStateId") String fromStateId,
@RequestParam(value = "actionId") String actionId) {
return ResponseEntity.ok(stateTransitionService
.findByFromStateAndAction(fromStateId, actionId));
}
這些 API 運行良好。 但我想知道是否有任何方法可以以更好的方式編寫這些 API。 我在想這個是因為,如果說有 n 個參數要搜索,這樣,我最終會編寫 2^n-1 個 API。
有人可以在這里幫忙嗎? 謝謝。
您需要一個動態查詢,您可以在其中創建對任何可能的參數組合的查詢。 有許多工具可以讓您這樣做。 我們在我們的項目中使用了 DSL 查詢。 它工作得很好,我會推薦它。 但這絕對不是唯一的解決方案。 這里有幾個鏈接可以開始:
使用 JPA 查詢 Querydsl 的指南,
帶有 Spring Data JPA 和 Querydsl 的 REST 查詢語言
Spring Data JPA - 參考文檔
如果您將它們作為Map<String,Object>
形式接收,則可以接收可變數量的參數Map<String,Object>
如下所示:
@GetMapping(value = "/search")
public ResponseEntity<Page<TcStateTransitionDTO>> search(@RequestParam Map<String, Object> params) {
return ResponseEntity.ok(stateTransitionService.searchByParams(params));
}
您可以創建一個標准地圖和基於使用參數動態查詢criteriaBuilder 。 如果您使用的是 JPA,那么只需將通過標准構建器生成的規范傳遞給 findAll 方法。
public Page<TcStateTransitionDTO> searchByParams(Map<String, Object> params) {
PageRequest pageRequest = generatePageRequestFromParams(params);
Specifications specifications = getSearchSpecifications(params);
return repository.findAll(specifications, pageRequest);
}
我提到的這個getSpecification(Map<String, Object> params)
方法是這里的主要玩家。 主要技巧是有效地編寫此方法。 我建議閱讀上面的鏈接以了解有關 CriteriaBuilder 的更多信息並對規范進行一些研究。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.