Drools 5.0.1中的角色对象比较

时间:2015-11-10 21:43:33

标签: java drools

我在drools 5.0.1的when子句中使用Character对象时遇到问题。

以下是的规则:

rule "Test"
    when
        $V1 : MyObject( )
        $V2 : EvalObject(
           $V1.getMyCharacter == "1"
        )
    then
        //do stuff
end

执行工作的规则

rule "Test"
    when
        $V1 : MyObject( )
        $V2 : EvalObject(
           $V1.getMyCharacter == "C"
        )
    then
        //do stuff
end

MyObject有一个名为myCharacter的Character字段。我想看看myCharacter是否为数字1.EvalObject只是一个空类。

似乎drools使用Character数据类型做了一些奇怪的事情。当比较针对非数字值时,它可以工作。当比较与数值相比时,它不起作用。

为什么数字字符比较在Drools 5.0.1中不起作用?

注意,我确实找到了两个下面的解决方法。

rule "Test"
    when
       $V1 : MyObject( )
       $V2 : EvalObject(
          eval($V1.getMyCharacter().equals('1'))
       )
    then
       //do stuff
end

rule "Test1"
    when
       $V1 : MyObject(myCharacter == "1")
    then
       //do stuff
end

1 个答案:

答案 0 :(得分:0)

此条件的错误:

    $V1 : MyObject( )
    $V2 : EvalObject( $V1.getMyCharacter == "1" )

是不允许将getter方法名称与事实(对象)引用名称结合使用,就好像它是一个字段一样。您可以在比较中使用字段作为成员的模式中使用字段名称(请参阅下面的Test1)或绑定变量(Test2,Test3),或者可以将方法名称与绑定到a的变量结合使用事实上在eval表达式中使用适当的Java语法(Test3,Test4)。

没有必要为编写约束创建一个单独的对象 - 在其他任何事情之前尝试Test1。将带有字段的约束放在字段所在的模式中:

rule "Test1"
when
    MyObject( myCharacter == '1' )
then
    //do stuff
end

如果这不起作用,条件元素eval应该在模式内或单独使用。

rule "Test2"
when
    MyObject( $mc: myCharacter, eval( $mc == '1' ) )
then
    //do stuff
end

rule "Test3"
when
    MyObject( $mc: myCharacter )
    eval( $mc == '1' )
then
    //do stuff
end

rule "Test4"
when
    $mo: MyObject()
    eval( $mo.getMyCharacter() == '1' )
then
    //do stuff
end