Drools 比较Drool 5.5中的字符串值字段

Drools 比较Drool 5.5中的字符串值字段,drools,Drools,当使用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)

当使用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类型,那么原来的规则工作得很好。这让我觉得这是因为字符串比较的一些错误。因此,使用定义为字符串类型的名称字段,我尝试:

  • not(name==n1美元)
  • (name=$n1)
  • name.toString()=$n1.toString()
  • name=$p1.getName()
  • 不幸的是,它们都没有起作用

    最后,我能让它正常运行的唯一方法是将规则写为:

    when
        $p1: Person($n1: name)
        $p2: Person(name == $n1)
        eval($p1!=$p2)
    
    这让我觉得问题可能是由
    这个
    的工作方式和字符串比较方式的组合造成的

    这是一个非常基本的特性,我很惊讶这是由Drools 5.5 final中的一个bug引起的。但是,我还是看不到出路。你们谁能帮忙

    谢谢


    GW

    结果是
    这个!=$p1
    转换为
    !这个.equals($p1)
    放在引擎盖下,在我的代码中我有一个自动生成的
    equals
    方法(原始帖子中没有显示代码),它完全改变了默认的比较行为。删除
    equals
    方法后,所有方法都按预期工作