java - 复杂的字段条件判断解析
PHPz
PHPz 2017-04-18 10:52:25
0
3
553

应用场景简化描述

现在有个用户Person,包含int age, BigDecimal money,java.util.Date accessTime等字段,对应于用户表person:

年龄(age : int) 资产 (money : number) 入网日期 (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) 运算符(oper : varchar) 阈值 (threshold : varchar )
age = 21
money > 280.05
accessTime > 2015-05-31

条件表condition用来配置过滤用户person的条件,表示要过滤出

  • 年龄等于21岁

  • 资产大于280.05

  • 入网日期在 2015-06-01之后

的所有用户。

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

如果oper为inbetween, 则阈值为多个,用逗号隔开。

问题

现在,对于不同的字段,在条件表condition里都是varchar类型,而在person表中,却有不同的类型。

而且,条件表里的条件是从web系统页面上,由用户配置的;也就是说,条件的个数不确定,配置的字段,运算符,阈值也都是不确定的。

问: 如何才能使用java代码,先将所有用户以及条件查出来,然后遍历每个用户,对于每个用户,遍历每个条件,怎样才能正确的判断该用户通过所有的条件检查,得出通过条件筛选的用户列表?(上边的场景是实际场景简化后的,请不要给出拼接sql,通过sql过滤的答案)


是不是可以把person的记录生成xml文件,条件生成xsd文件,用xsd去校验xml ??

PHPz
PHPz

学习是最好的投资!

membalas semua(3)
小葫芦

Jika anda tidak menggunakan SQL, anda boleh mempertimbangkan untuk menggunakan model rantaian tanggungjawab untuk mendapatkan semua data dan meletakkannya dalam senarai pautan
Kemudian tulis penapis untuk menapis kandungan dalam koleksi bersamaan dengan penapis

刘奇

Berapa besarkah jadual pengguna anda.

Kaedah formal ialah menggunakan sql untuk menyemak. . .

Pendekatan yang lebih maju adalah untuk menyesuaikan bahasa khusus domain dan kemudian menukarnya kepada sql. Tidak mustahil untuk menggunakan penapisan xml.

左手右手慢动作

Saya rasa condition表 anda tidak berguna? Simpan data sahaja? Adalah lebih baik jika anda boleh menggunakan json untuk menyerahkannya buat sementara. Jika anda ingin menyimpannya secara berterusan, anda sekurang-kurangnya mempunyai admin_id atau sesuatu untuk menandakan keadaan penapisan yang digunakan. Rasanya kurang cekap berbanding membuangnya terus ke dalam redis.

Nampaknya anda menggunakan Java, tetapi saya sudah biasa menggunakan PHP, jadi saya akan menerangkan secara ringkas idea saya menggunakan PHP...

Tulis Filter类 untuk mengendalikan penukaran condition kepada 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);
}

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

Tulisan tangan, sila abaikan kesalahan tatabahasa...

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan