亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

java - 復(fù)雜的字段條件判斷解析
PHPz
PHPz 2017-04-18 10:52:25
0
3
619

應(yīng)用場(chǎng)景簡(jiǎn)化描述

現(xiàn)在有個(gè)用戶Person,包含int age, BigDecimal money,java.util.Date accessTime等字段,對(duì)應(yīng)于用戶表person:

年齡(age : int) 資產(chǎn) (money : number) 入網(wǎng)日期 (accessTime : date)
20 100.00 2017-03-24
20 150.00 2016-05-07
21 300.00 2015-04-03
21 240.00 2015-07-15
22 300.00 2014-12-21
21 300.00 2014-12-21

另外,有一張條件表,condition:

字段名(fieldName : varchar) 運(yùn)算符(oper : varchar) 閾值 (threshold : varchar )
age = 21
money > 280.05
accessTime > 2015-05-31

條件表condition用來配置過濾用戶person的條件,表示要過濾出

  • 年齡等于21歲

  • 資產(chǎn)大于280.05

  • 入網(wǎng)日期在 2015-06-01之后

的所有用戶。

其中,oper可取的值有 = , < , > , >= , <= , in , between

如果oper為inbetween, 則閾值為多個(gè),用逗號(hào)隔開。

問題

現(xiàn)在,對(duì)于不同的字段,在條件表condition里都是varchar類型,而在person表中,卻有不同的類型。

而且,條件表里的條件是從web系統(tǒng)頁(yè)面上,由用戶配置的;也就是說,條件的個(gè)數(shù)不確定,配置的字段,運(yùn)算符,閾值也都是不確定的。

問: 如何才能使用java代碼,先將所有用戶以及條件查出來,然后遍歷每個(gè)用戶,對(duì)于每個(gè)用戶,遍歷每個(gè)條件,怎樣才能正確的判斷該用戶通過所有的條件檢查,得出通過條件篩選的用戶列表?(上邊的場(chǎng)景是實(shí)際場(chǎng)景簡(jiǎn)化后的,請(qǐng)不要給出拼接sql,通過sql過濾的答案)


是不是可以把person的記錄生成xml文件,條件生成xsd文件,用xsd去校驗(yàn)xml ??

PHPz
PHPz

學(xué)習(xí)是最好的投資!

全部回覆(3)
小葫蘆

如果不用sql的話,可以考慮使用責(zé)任鏈模式,將所有資料獲取出來放到linkedlist裡面,
然後寫個(gè)過濾器來過濾集合裡面的內(nèi)容,每一個(gè)條件可以相當(dāng)於一個(gè)過濾器

劉奇

你用戶表有多大,還全部查出來。

正規(guī)做法都是拼sql查吧。 。 。

更高階的做法應(yīng)該是自訂領(lǐng)域特定語言,然後轉(zhuǎn)sql吧,反正不可能是用xml過濾。

左手右手慢動(dòng)作

感覺你這個(gè)condition表沒什么用啊??jī)H僅是存儲(chǔ)數(shù)據(jù)?如果臨時(shí)的直接用json傳過來就好了,如果你要持久存儲(chǔ)的話,起碼要個(gè)admin_id什么的,來標(biāo)記下是誰的篩選條件。感覺效率不如直接扔到redis好點(diǎn)。

看你用的是Java,不過我習(xí)慣用PHP,就用PHP簡(jiǎn)單描述下我的思路吧...

寫一個(gè)Filter類處理condition轉(zhuǎn)換為sql。

class Filter {
    public function doFilter() {
        //1. 獲取登錄的admin_id
        //2. 獲取篩選條件
        /**
         * 數(shù)據(jù)格式例子為: [
         *    'field' => 'age';, 
         *    'type'  => 'compare',
         *    'ext'   => '>',
         *    'value' => '2'
         * ]
         */
        foreach($conditions as $condition) {
            // 根據(jù)type獲取對(duì)應(yīng)的$conditionHandle
            $conditionHandle::parse($condition);
        }
    }
}

// Condition接口
interface Condition {
    // 解析數(shù)據(jù),返回sql片段和需要填充的數(shù)據(jù)(此處使用PDO預(yù)處理,減少SQL注入)
    static function parse($data);
}

// ConditionHandle
namespace Condition;
class Compare implements Condition {
    // 執(zhí)行流程
    public static function parse($data) {
        ...
        return [
            'sql' => 'age > ?',
            'params' => [ 2 ]
        ];
    }
}

手寫的,文法錯(cuò)誤請(qǐng)忽略...

最新下載
更多>
網(wǎng)站特效
網(wǎng)站源碼
網(wǎng)站素材
前端模板