簡體   English   中英

在 Spring boot 應用程序中根據不同的搜索參數組合編寫搜索 API

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM