java實現(xiàn)頁面多查詢條件必選的統(tǒng)一處理思路
背景
開發(fā)中我們可能會遇到會頁面對應(yīng)的數(shù)據(jù)表量級較大、頁面查詢條件過多的情況,那么有時候我們可能會限制做查詢操作是必須選擇至少一個查詢條件。
頁面效果:

直接查詢會提示:

思路
我們考慮使用注解+切面的形式來實現(xiàn),用來確定哪些方法、哪些參數(shù)是需要做篩選和判斷的。
注解類:
用來標識某個參數(shù)和某個類的切入點
/**
* 用來標識某個參數(shù)和某個類的切入點
* @author zhouli
* @Classname ConditionLimitAspect
* @Date 2022/4/6 19:39
*/
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.PARAMETER, ElementType.METHOD})
public @interface ConditionLimit {
/**
* 限制條件最少個數(shù)
*
* @return
*/
int conditionNumberLimit() default 1;
}
/**
* 用來標識哪些字段用來統(tǒng)計查詢列
* @author zhouli
* @Classname ConditionLimitAspect
* @Date 2022/4/6 19:39
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface ConditionField {
}切面類:
@Slf4j
@Aspect
@Component
public class ConditionLimitAspect {
@Around("execution(* com.p4.tp.system.modules.*.rest.*.*(..,@com.p4.tp.system.config.aop.ConditionLimit (*),..))")
public Object doCheckCondition(ProceedingJoinPoint point) throws Throwable {
MethodSignature signature = (MethodSignature) point.getSignature();
Method method = signature.getMethod();
Parameter[] parameters = method.getParameters();
for (int i = 0; i < parameters.length; i++) {
//多個參數(shù)時循環(huán)
ConditionLimit annotation = parameters[i].getAnnotation(ConditionLimit.class);
if (annotation == null) {
continue;
}
//設(shè)定的最小查詢列數(shù)量
int numberLimit = annotation.conditionNumberLimit();
Object[] args = point.getArgs();
Class<?> aClass =args[i].getClass();
Field[] declaredFields = aClass.getDeclaredFields();
//查詢條件計數(shù)
int realNum = 0;
for (Field field : declaredFields) {
//獲取帶ConditionField注解的字段
ConditionField conditionField = field.getAnnotation(ConditionField.class);
if (conditionField == null) {
continue;
}
field.setAccessible(true);
//獲取列值
Object value = field.get(args[i]);
if (value == null) {
continue;
}
try {
//列舉三種情況
if (value instanceof String && StringUtils.isNotBlank((String) value)) {
realNum++;
} else if (value instanceof Collection && !CollectionUtils.isEmpty((Collection<?>) value)) {
realNum++;
} else if (value instanceof Date) {
realNum++;
}
} catch (Exception e) {
log.error("條件限定異常,", e);
}
}
if (realNum < numberLimit) {
log.info("查詢條件不足,請至少選擇或輸入" + numberLimit + "個查詢條件");
throw new BusinessException("查詢條件不足,請至少選擇或輸入" + numberLimit + "個查詢條件");
}
}
return point.proceed();
}
}使用
創(chuàng)建實體
@Data
public class FlowCardInfoParam {
@ConditionField
private String iccId;
@ConditionField
private String termSn;
@ConditionField
private String imei;
}
方法使用
@PostMapping("/getPage")
public ResponseEntity<Object> getPage(@RequestBody @ConditionLimit FlowCardInfoParam param) {
return new ResponseEntity<>(null, HttpStatus.OK);
}現(xiàn)在我們使用接口請求
第一次不填寫參數(shù)值:{} ,查看日志結(jié)果:

第二次填寫 iccId 值重新請求: {"iccId":"898604B11921D0192003"},我們就能看到直接放過進行正常的業(yè)務(wù)調(diào)用了。
尾言
以上便是實現(xiàn)多查詢條件中必選至少一種字段值的一種思路,正常情況下我們沒有必要也沒有辦法枚舉出所有頁面中出現(xiàn)的所有必要的查詢條件,那么就可以考慮做找一個前置的統(tǒng)一處理方法。利用切面在進入方法前就進行判斷,該次請求是否符合接口最低的要求,更多關(guān)于java頁面多查詢條件的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
基于SpringMVC接受JSON參數(shù)詳解及常見錯誤總結(jié)
下面小編就為大家分享一篇基于SpringMVC接受JSON參數(shù)詳解及常見錯誤總結(jié),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-03-03
SpringBoot+WebSocket實現(xiàn)即時通訊功能(J2EE方式)
WebSocket是一種在單個TCP連接上進行全雙工通信的協(xié)議,WebSocket使得客戶端和服務(wù)器之間的數(shù)據(jù)交換變得更加簡單,允許服務(wù)端主動向客戶端推送數(shù)據(jù),本文給大家介紹了SpringBoot+WebSocket實現(xiàn)即時通訊功能(J2EE方式),需要的朋友可以參考下2025-01-01
Jpa?Specification如何實現(xiàn)and和or同時使用查詢
這篇文章主要介紹了Jpa?Specification如何實現(xiàn)and和or同時使用查詢,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-11-11
HashMap工作原理_動力節(jié)點Java學(xué)院整理
這篇文章主要介紹了HashMap工作原理_動力節(jié)點Java學(xué)院整理,需要的朋友可以參考下2017-04-04

