You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

后端Server-side排序:如何根据sortDir参数动态切换ASC/DESC?

动态切换Spring Data JPA排序方向的优雅实现

首先,你之前的代码有两个核心问题需要修正:

  • Java里字符串相等比较不能用==,它比较的是对象引用而非内容,这大概率是你之前代码无效的原因,应该用equals()equalsIgnoreCase()
  • 重复的业务调用代码可以合并,没必要分if-else分支重复编写

下面提供几种优雅的实现方式:

方法一:利用Sort.Direction枚举的valueOf方法(推荐)

Spring Data JPA的Sort.Direction是枚举类,自带valueOf()方法可以直接将字符串转换为枚举值,我们只需要确保输入格式匹配(枚举值为大写的ASC/DESC),同时增加参数合法性校验:

@PreAuthorize("hasAuthority('service_manager')")
@RequestMapping(path = "/clients", method = RequestMethod.GET)
public Page<ClientResponse> getClients(
 @RequestParam(defaultValue = "0") Integer page,
 @RequestParam(defaultValue = "10") Integer size,
 @RequestParam(required = false) String companyName,
 @RequestParam(required = false) BigInteger firmRegNo,
 @RequestParam(required = false) String address,
 @RequestParam(required = false) BigInteger contractNo,
 @RequestParam(required = false) BigInteger monthlyPay,
 @RequestParam(required = false) User.UserStatus status,
 @RequestParam(defaultValue = "createTime") String sort,
 @RequestParam(defaultValue = "desc") String sortDir
) {
 ClientListRequest request = new ClientListRequest(companyName, firmRegNo, address, contractNo, monthlyPay, status);
 
 // 处理排序方向:兼容大小写输入,同时处理非法参数
 Sort.Direction direction = Optional.ofNullable(sortDir)
     .map(String::trim)
     .map(String::toUpperCase)
     .map(dir -> {
         try {
             return Sort.Direction.valueOf(dir);
         } catch (IllegalArgumentException e) {
             // 若传入无效值,默认使用降序
             return Sort.Direction.DESC;
         }
     })
     .orElse(Sort.Direction.DESC);

 return clientService.getAllClients(request, PageRequest.of(page, size, direction, sort))
 .map(ClientResponse::new);
}

方法二:简化的三元表达式

如果不需要处理非法参数,只是简单根据参数切换方向,可以用三元表达式快速实现:

// 忽略其他参数...
Sort.Direction direction = "asc".equalsIgnoreCase(sortDir) ? Sort.Direction.ASC : Sort.Direction.DESC;

return clientService.getAllClients(request, PageRequest.of(page, size, direction, sort))
 .map(ClientResponse::new);

关键注意事项

  1. 字符串比较:务必用equalsIgnoreCase()(不区分大小写)或equals()(严格区分),绝对不要用==
  2. 参数健壮性:建议对sortDir做合法性校验,防止传入无效值导致程序报错
  3. 代码复用:把排序方向的逻辑抽离出来,避免重复编写业务调用代码

内容的提问来源于stack exchange,提问作者eixcs

火山引擎 最新活动