Drools入门之query查询

元素query指查询,从结构图上看,它以query开头、以end结束,其中包含query name,查询参数是可以选择的,多个参数以逗号为分隔符,查询是一种条件匹配的方式,因为它只包含LHS部分,因此不需要指定when或then。如何判断条件匹配是否正确,可以通过Java代码进行获取。查询的name在当前规则库的逻辑路径下是唯一的,这点与规则名称约束相似。

举个例子

public class RulesQuery {
    public static void main(String[] args) {
        KieServices kieService = KieServices.Factory.get();
        KieContainer kieContainer = kieService.getKieClasspathContainer();
        KieSession kieSession = kieContainer.newKieSession("testQuery");
        Person person1 = new Person("张三", 30);
        Person person2 = new Person("李四", 25);
        Person person3 = new Person("王五", 40);

        kieSession.insert(person1);
        kieSession.insert(person2);
        kieSession.insert(person3);

        QueryResults queryResults = kieSession.getQueryResults("person age is 25");
        for (QueryResultsRow q : queryResults) {
            Person p  = (Person) q.get("person");
            System.out.println("输出符合查询条件的实体对象name为"+p.getName());
        }

        kieSession.dispose();
    }
}
import com.domain.Person

query "person age is 25"
    person:Person(age == 25)
end

执行日志

输出符合查询条件的实体对象name为李四

query还可以接收参数

public class RulesQuery {
    public static void main(String[] args) {
        KieServices kieService = KieServices.Factory.get();
        KieContainer kieContainer = kieService.getKieClasspathContainer();
        KieSession kieSession = kieContainer.newKieSession("testQuery");
        Person person1 = new Person("张三", 30);
        Person person2 = new Person("李四", 25);
        Person person3 = new Person("王五", 40);

        kieSession.insert(person1);
        kieSession.insert(person2);
        kieSession.insert(person3);

        QueryResults queryResults = kieSession.getQueryResults("person age is 25");
        for (QueryResultsRow q : queryResults) {
            Person p  = (Person) q.get("person");
            System.out.println("输出符合查询条件的实体对象name为"+p.getName());
        }

        Object[] params = new Object[]{"王五"};
        QueryResults queryResults2 = kieSession.getQueryResults("queryRule",params);
        for (QueryResultsRow q : queryResults2) {
            Person p  = (Person) q.get("person");
            System.out.println("输出符合查询条件的实体对象name为"+p.getName());
        }

        kieSession.dispose();
    }
}
import com.domain.Person

query "person age is 25"
    person:Person(age == 25)
end

query "queryRule"(String $name)
    person:Person(age == 40,name==$name)
end
输出符合查询条件的实体对象name为李四
输出符合查询条件的实体对象name为王五

Drools入门之query查询
https://www.zhaojun.inkhttps://www.zhaojun.ink/archives/drools-query
作者
卑微幻想家
发布于
2022-06-30
许可协议