在使用 Drools 5.5 final 比较字符串值字段时,我遇到了一些令人费解的问题。
本质上,我试图找出是否有一对同名的人。Person 类如下所示:
public class Person {
private String name;
public String getName() { return name; }
public void setName(String n) { this.name = n; }
public Person(String name) { this.name = name;}
}
我尝试触发的规则是:
rule "uniquePersonName"
when
$p1: Person($n1: name)
$p2: Person(this != $p1, name == $n1)
then
System.out.println("Duplicated person name found : " + $n1 + " " + $p2.getName());
end
但它从未被触发。但是,如果我将其更改为:
when
$p1: Person($n1: name)
$p2: Person(this != $p1, name != $n1)
该系统按预期工作,换句话说,它会找到所有具有不同姓名的人的配对。
深入挖掘后,我发现如果我将 name 字段更改为 Integer 类型,则原始规则可以正常工作。这让我觉得这是因为字符串比较的一些错误。因此,将 name 字段定义为 String 类型,我尝试了:
not (name == $n1)
(name == $n1)
name.toString() = $n1.toString()
name == $p1.getName()
不幸的是,他们都没有工作。
最后,我可以让它表现的唯一方法是将规则编写为:
when
$p1: Person($n1: name)
$p2: Person(name == $n1)
eval($p1!=$p2)
这让我觉得问题可能是由如何this
工作和如何完成字符串比较引起的。
这是非常基本的功能,我会很惊讶这是由 Drools 5.5 final 中的错误引起的。但同样,我看不到一条路。你们中的任何人都可以帮忙吗?
谢谢。
GW