Maison  >  Questions et réponses  >  le corps du texte

java - 复杂的字段条件判断解析

应用场景简化描述

现在有个用户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的条件,表示要过滤出

的所有用户。

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

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

问题

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

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

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


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

PHPzPHPz2743 Il y a quelques jours489

répondre à tous(3)je répondrai

  • 高洛峰

    高洛峰2017-04-18 10:54:25

    Si vous n'utilisez pas SQL, vous pouvez envisager d'utiliser le modèle de chaîne de responsabilité pour obtenir toutes les données et les mettre dans la liste chaînée
    Écrivez ensuite un filtre pour filtrer le contenu de la collection. être équivalent à un filtre

    répondre
    0
  • 怪我咯

    怪我咯2017-04-18 10:54:25

    Quelle est la taille de votre table d'utilisateurs ? Découvrez tout cela.

    La méthode formelle consiste à utiliser SQL pour vérifier. . .

    Une approche plus avancée devrait consister à personnaliser le langage spécifique au domaine, puis à le convertir en SQL. De toute façon, il est impossible d'utiliser le filtrage XML.

    répondre
    0
  • ringa_lee

    ringa_lee2017-04-18 10:54:25

    J'ai l'impression que ton condition表 ne sert à rien ? Juste stocker des données ? Ce serait mieux si vous pouviez utiliser json pour le transmettre temporairement. Si vous souhaitez le stocker de manière persistante, vous devriez au moins avoir un admin_id ou quelque chose pour marquer les conditions de filtrage utilisées. Cela semble moins efficace que de le jeter directement dans redis.

    Il semble que vous utilisez Java, mais je suis habitué à utiliser PHP, je vais donc décrire brièvement mon idée en utilisant PHP...

    Écrivez un Filter类 pour gérer la conversion de condition en 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 ]
            ];
        }
    }

    Manuscrit, veuillez ignorer les erreurs grammaticales...

    répondre
    0
  • Annulerrépondre