规则引擎Drools使用 第九篇 Drools 的高级语法之query使用
程序员文章站
2022-05-28 11:17:53
...
query查询提供了一种查询working memory中符合约束条件的Fact对象的简单方法。它仅包含规则文件中的LHS部分,不用指定“when”和“then”部分并且以end结束。具体语法结构如下:
query 查询的名称(可选参数) LHS end
写规则文件/resources/rules/query.drl:
package testquery
import com.drools.entity.Student
/*
此规则文件用于测试query查询
*/
//不带参数的查询
//当前query用于查询Working Memory中age>10的Student对象
query "query_1"
$student:Student(age > 10)
end
//带有参数的查询
//当前query用于查询Working Memory中age>10同时name需要和传递的参数name相同的Student对象
query "query_2"(String sname)
$student:Student(age > 20 && name == sname)
end
编写单元测试
KieServices kieServices = KieServices.Factory.get();
KieContainer kieClasspathContainer = kieServices.getKieClasspathContainer();
KieSession kieSession = kieClasspathContainer.newKieSession();
Student student1 = new Student();
student1.setName("张三");
student1.setAge(12);
Student student2 = new Student();
student2.setName("李四");
student2.setAge(8);
Student student3 = new Student();
student3.setName("王五");
student3.setAge(22);
//将对象插入Working Memory中
kieSession.insert(student1);
kieSession.insert(student2);
kieSession.insert(student3);
//调用规则文件中的查询
QueryResults results1 = kieSession.getQueryResults("query_1");
int size = results1.size();
System.out.println("size=" + size);
for (QueryResultsRow row : results1) {
Student student = (Student) row.get("$student");
System.out.println(student);
}
//调用规则文件中的查询
QueryResults results2 = kieSession.getQueryResults("query_2","王五");
size = results2.size();
System.out.println("size=" + size);
for (QueryResultsRow row : results2) {
Student student = (Student) row.get("$student");
System.out.println(student);
}
//kieSession.fireAllRules();
kieSession.dispose();
使用query查询,在规则编写上他给我们优化了很多,但是它的使用局限性也很明显,它通常使用在查询内存中的数据。
上一篇: Drools动态更新规则