java - 復雜的字段條件判斷解析
問題描述
應用場景簡化描述現在有個用戶Person,包含int age, BigDecimal money,java.util.Date accessTime等字段,對應于用戶表person:
年齡(age : int)資產 (money : number)入網日期 (accessTime : date)20100.002017-03-2420150.002016-05-0721300.002015-04-0321240.002015-07-1522300.002014-12-2121300.002014-12-21另外,有一張條件表,condition:
字段名(fieldName : varchar)運算符(oper : varchar)閾值 (threshold : varchar )age=21money>280.05accessTime>2015-05-31條件表condition用來配置過濾用戶person的條件,表示要過濾出
年齡等于21歲
資產大于280.05
入網日期在 2015-06-01之后
的所有用戶。
其中,oper可取的值有 = , < , > , >= , <= , in , between
如果oper為in或between, 則閾值為多個,用逗號隔開。
問題現在,對于不同的字段,在條件表condition里都是varchar類型,而在person表中,卻有不同的類型。
而且,條件表里的條件是從web系統頁面上,由用戶配置的;也就是說,條件的個數不確定,配置的字段,運算符,閾值也都是不確定的。
問: 如何才能使用java代碼,先將所有用戶以及條件查出來,然后遍歷每個用戶,對于每個用戶,遍歷每個條件,怎樣才能正確的判斷該用戶通過所有的條件檢查,得出通過條件篩選的用戶列表?(上邊的場景是實際場景簡化后的,請不要給出拼接sql,通過sql過濾的答案)
是不是可以把person的記錄生成xml文件,條件生成xsd文件,用xsd去校驗xml ??
問題解答
回答1:如果不用sql的話,可以考慮使用責任鏈模式,將所有數據獲取出來放到linkedlist里面,然后寫個過濾器來過濾集合里面的內容,每一個條件可以相當于一個過濾器
回答2:你用戶表有多大,還全部查出來。
正規做法都是拼sql查吧。。。
更高級的做法應該是自定義領域特定語言,然后轉sql吧,反正不可能是用xml過濾。
回答3:感覺你這個condition表沒什么用啊?僅僅是存儲數據?如果臨時的直接用json傳過來就好了,如果你要持久存儲的話,起碼要個admin_id什么的,來標記下是誰的篩選條件。感覺效率不如直接扔到redis好點。
看你用的是Java,不過我習慣用PHP,就用PHP簡單描述下我的思路吧...
寫一個Filter類處理condition轉換為sql。
class Filter { public function doFilter() {//1. 獲取登錄的admin_id//2. 獲取篩選條件/** * 數據格式例子為: [ * ’field’ => ’age’;, * ’type’ => ’compare’, * ’ext’ => ’>’, * ’value’ => ’2’ * ] */foreach($conditions as $condition) { // 根據type獲取對應的$conditionHandle $conditionHandle::parse($condition);} }}// Condition接口interface Condition { // 解析數據,返回sql片段和需要填充的數據(此處使用PDO預處理,減少SQL注入) static function parse($data);}// ConditionHandlenamespace Condition;class Compare implements Condition { // 執行流程 public static function parse($data) {...return [ ’sql’ => ’age > ?’, ’params’ => [ 2 ]]; }}
手寫的,語法錯誤請忽略...
相關文章:
1. docker 下面創建的IMAGE 他們的 ID 一樣?這個是怎么回事????2. mac連接阿里云docker集群,已經卡了2天了,求問?3. javascript - [React Native]如何在Tabs內維護每一個ListView的滾動條?4. 微信網頁授權的access_token需要緩存嗎?5. css3 - transform的順序不同為何會使元素的形狀不同。6. javascript - 使用form進行頁面跳轉,但是很慢,如何加一個Loading?7. javascript - Tomcat突然就報錯了,解析不了java文件,試過幾個百度的解決方法,沒解決。8. objective-c - iOS開發支付寶和微信支付完成為什么跳轉到了之前開發的一個app?9. javascript - 圖片鏈接請求一直是pending狀態,導致頁面崩潰,怎么解決?10. javascript - 移動端做pad適配
