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

直接查詢(xún)會(huì)提示:

思路
我們考慮使用注解+切面的形式來(lái)實(shí)現(xiàn),用來(lái)確定哪些方法、哪些參數(shù)是需要做篩選和判斷的。
注解類(lèi):
用來(lái)標(biāo)識(shí)某個(gè)參數(shù)和某個(gè)類(lèi)的切入點(diǎn)
/**
* 用來(lái)標(biāo)識(shí)某個(gè)參數(shù)和某個(gè)類(lèi)的切入點(diǎn)
* @author zhouli
* @Classname ConditionLimitAspect
* @Date 2022/4/6 19:39
*/
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.PARAMETER, ElementType.METHOD})
public @interface ConditionLimit {
/**
* 限制條件最少個(gè)數(shù)
*
* @return
*/
int conditionNumberLimit() default 1;
}
/**
* 用來(lái)標(biāo)識(shí)哪些字段用來(lái)統(tǒng)計(jì)查詢(xún)列
* @author zhouli
* @Classname ConditionLimitAspect
* @Date 2022/4/6 19:39
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface ConditionField {
}切面類(lèi):
@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++) {
//多個(gè)參數(shù)時(shí)循環(huán)
ConditionLimit annotation = parameters[i].getAnnotation(ConditionLimit.class);
if (annotation == null) {
continue;
}
//設(shè)定的最小查詢(xún)列數(shù)量
int numberLimit = annotation.conditionNumberLimit();
Object[] args = point.getArgs();
Class<?> aClass =args[i].getClass();
Field[] declaredFields = aClass.getDeclaredFields();
//查詢(xún)條件計(jì)數(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("查詢(xún)條件不足,請(qǐng)至少選擇或輸入" + numberLimit + "個(gè)查詢(xún)條件");
throw new BusinessException("查詢(xún)條件不足,請(qǐng)至少選擇或輸入" + numberLimit + "個(gè)查詢(xún)條件");
}
}
return point.proceed();
}
}使用
創(chuàng)建實(shí)體
@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)在我們使用接口請(qǐng)求
第一次不填寫(xiě)參數(shù)值:{} ,查看日志結(jié)果:

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

