欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

java實(shí)現(xiàn)頁面多查詢條件必選的統(tǒng)一處理思路

 更新時(shí)間:2023年06月15日 17:20:52   作者:我是一顆小虎牙_  
這篇文章主要為大家介紹了java實(shí)現(xiàn)頁面多查詢條件必選的統(tǒng)一處理思路詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

背景

開發(fā)中我們可能會(huì)遇到會(huì)頁面對(duì)應(yīng)的數(shù)據(jù)表量級(jí)較大、頁面查詢條件過多的情況,那么有時(shí)候我們可能會(huì)限制做查詢操作是必須選擇至少一個(gè)查詢條件。

頁面效果:

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

思路

我們考慮使用注解+切面的形式來實(shí)現(xiàn),用來確定哪些方法、哪些參數(shù)是需要做篩選和判斷的。

注解類:

用來標(biāo)識(shí)某個(gè)參數(shù)和某個(gè)類的切入點(diǎn)

/**
 * 用來標(biāo)識(shí)某個(gè)參數(shù)和某個(gè)類的切入點(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;
}
/**
 * 用來標(biāo)識(shí)哪些字段用來統(tǒng)計(jì)查詢列
 * @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++) {
            //多個(gè)參數(shù)時(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();
            //查詢條件計(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("查詢條件不足,請(qǐng)至少選擇或輸入" + numberLimit + "個(gè)查詢條件");
                throw new BusinessException("查詢條件不足,請(qǐng)至少選擇或輸入" + numberLimit + "個(gè)查詢條件");
            }
        }
        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)求

第一次不填寫參數(shù)值:{} ,查看日志結(jié)果:

第二次填寫 iccId 值重新請(qǐng)求: {"iccId":"898604B11921D0192003"},我們就能看到直接放過進(jìn)行正常的業(yè)務(wù)調(diào)用了。

尾言

以上便是實(shí)現(xiàn)多查詢條件中必選至少一種字段值的一種思路,正常情況下我們沒有必要也沒有辦法枚舉出所有頁面中出現(xiàn)的所有必要的查詢條件,那么就可以考慮做找一個(gè)前置的統(tǒng)一處理方法。利用切面在進(jìn)入方法前就進(jìn)行判斷,該次請(qǐng)求是否符合接口最低的要求,更多關(guān)于java頁面多查詢條件的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 基于SpringMVC接受JSON參數(shù)詳解及常見錯(cuò)誤總結(jié)

    基于SpringMVC接受JSON參數(shù)詳解及常見錯(cuò)誤總結(jié)

    下面小編就為大家分享一篇基于SpringMVC接受JSON參數(shù)詳解及常見錯(cuò)誤總結(jié),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-03-03
  • IDEA設(shè)置JVM運(yùn)行參數(shù)的方法步驟

    IDEA設(shè)置JVM運(yùn)行參數(shù)的方法步驟

    這篇文章主要介紹了IDEA設(shè)置JVM運(yùn)行參數(shù)的方法步驟,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • SpringBoot+WebSocket實(shí)現(xiàn)即時(shí)通訊功能(J2EE方式)

    SpringBoot+WebSocket實(shí)現(xiàn)即時(shí)通訊功能(J2EE方式)

    WebSocket是一種在單個(gè)TCP連接上進(jìn)行全雙工通信的協(xié)議,WebSocket使得客戶端和服務(wù)器之間的數(shù)據(jù)交換變得更加簡單,允許服務(wù)端主動(dòng)向客戶端推送數(shù)據(jù),本文給大家介紹了SpringBoot+WebSocket實(shí)現(xiàn)即時(shí)通訊功能(J2EE方式),需要的朋友可以參考下
    2025-01-01
  • Mybatis打印替換占位符后的完整Sql教程

    Mybatis打印替換占位符后的完整Sql教程

    這篇文章主要介紹了Mybatis打印替換占位符后的完整Sql教程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-10-10
  • 在Java8中構(gòu)建Stream流的多種方式詳解

    在Java8中構(gòu)建Stream流的多種方式詳解

    當(dāng)我們處理集合數(shù)據(jù)時(shí),往往需要對(duì)其進(jìn)行各種操作,如過濾、映射、排序、歸約等,在 Java 8 中引入的 Stream 流為我們提供了一種更加簡潔和靈活的方式來處理數(shù)據(jù),本文將介紹如何基于 Stream 構(gòu)建流,為你展示創(chuàng)建和操作流的多種方法
    2023-08-08
  • Jpa?Specification如何實(shí)現(xiàn)and和or同時(shí)使用查詢

    Jpa?Specification如何實(shí)現(xiàn)and和or同時(shí)使用查詢

    這篇文章主要介紹了Jpa?Specification如何實(shí)現(xiàn)and和or同時(shí)使用查詢,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • Java最長公共子序列示例源碼

    Java最長公共子序列示例源碼

    這篇文章主要介紹了Java最長公共子序列的定義及示例源代碼,具有一定參考價(jià)值,需要的朋友可以看下。
    2017-09-09
  • 在Mac OS上安裝Tomcat服務(wù)器的教程

    在Mac OS上安裝Tomcat服務(wù)器的教程

    這篇文章主要介紹了在Mac OS上安裝Tomcat服務(wù)器的教程,方便進(jìn)行工作環(huán)境下的Java web開發(fā),需要的朋友可以參考下
    2015-11-11
  • Struts2 Result 參數(shù)詳解

    Struts2 Result 參數(shù)詳解

    這篇文章主要講解Struts2 Result的參數(shù),講的比較詳細(xì),希望能給大家做一個(gè)參考。
    2016-06-06
  • HashMap工作原理_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    HashMap工作原理_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    這篇文章主要介紹了HashMap工作原理_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理,需要的朋友可以參考下
    2017-04-04

最新評(píng)論