专注收集记录技术开发学习笔记、技术难点、解决方案
网站信息搜索 >> 请输入关键词:
您当前的位置: 首页 > JBoss

Drools(JBOSS RULES)全局变量在LHS(WHEN)中的使用或指定Fact的调用?该怎么处理

发布时间:2010-06-14 16:56:03 文章来源:www.iduyao.cn 采编人员:星星草
Drools(JBOSS RULES)全局变量在LHS(WHEN)中的使用或指定Fact的调用?
刚学Drools不久,遇到了个规则不知道怎么处理了:
现在在处理这么一个规则:有两个商户号(同一个商户有多个商户号,一个商户号只对应一个商户),1,根据两个商户号用hibernate从数据库中查找出匹配的商户资料,如果任何一个商户数据库里不能找出,做处理1
2,再根据查找出的结果判断是否同一家商户,如果是,做处理2,如果不是,做处理3.

我现在能做到的是第一步,第二步不知道怎么实现?
第一步的代码:

package com.sample

import com.sample.entity.TempEntity
import org.hibernate.Session;

rule "Hello World"
lock-on-active  
        when
$session : Session()
$TempEntity : TempEntity($bin : bin)
        $temp : TempEntity( bin == $bin ) from $session.createQuery("from TempEntity").list()
        then
//do something here
         end

session是hibernate的一个session,TempEntity是商户号的封装类,一开始只放进了一个商户号码,从数据库得到的是一个有完整信息的封装类对象.$TempEntity是放进workingmemory的fact,$bin是$TempEntity中的一个属性,,就是已知的两个商户号.得出的结果是以两个商户号作为条件两次执行then部分.

我尝试过以下4种方法,但都没有成功




    1.将$bin使用全局变量代替,没有报错,但是条件不符合,只看到执行了hibernate查询,结论(then)部分不能执行.但是bin1和bin2能在
条件为真时,在结论部分直接打印出来
           代码如下(红色为变更部分):

package com.sample
 
import com.sample.entity.TempEntity
import org.hibernate.Session;

global java.lang.Integer bin1;
global java.lang.Integer bin2;

 
rule "Hello World"
lock-on-active  
        when
$session : Session()
$TempEntity : TempEntity($bin : bin)
        $temp : TempEntity( bin == bin1 ) from $session.createQuery("from TempEntity").list()
               $temp2 : TempEntity( bin == bin2 ) from $session.createQuery("from TempEntity").list()
        then
//do something here
                 System.out.println(bin1+bin2);
         end

   2.将两个商户号放进封装类,再设置为全局变量.就是把第一段代码中的$TempEntity不作为fact而是作为全局变量放进rule(规则)中.但是我不知道怎么在when(LHS)即条件语句块中使用.几次尝试都是失败.包括使用menberOf,contains,等等.
   3. 两个商户号放进封装类,作为fact插入workingmemory.在条件语句中加入eval($bin1 != $bin2 && $temp1.name == $temp2.name ).就是判断条件是两个商户号不同,而商户名称相同.这样会执行两次结论.代码如下

package com.sample
 
import com.sample.entity.TempEntity
import org.hibernate.Session;

rule "Hello World"
lock-on-active  
        when
$session : Session()
$TempEntity : TempEntity($bin1 : bin)
$TempEntity2 : TempEntity($bin2 : bin)
       $temp1 : TempEntity( bin == $bin1 ) from $session.createQuery("from TempEntity").list()
               $temp2 : TempEntity( bin == $bin2 ) from $session.createQuery("from TempEntity").list()
        eval($bin1 != $bin2 && $temp1.name == $temp2.name )
 then
//do something here
                 System.out.println(bin1+bin2);
         end


得出的结果是,$bin1,和$bin2会依次赋值为:   1:商号1,商号1  2:商号1,商号2   3:商号2,商号1   4:商号2,商号2 然后以此执行下面的语句.也就是说,假如符合我设置的条件,即商户号不同,商户名相同,会有两个情况符合,会执行两次结论.
4.把两个商户号封装成不同的两个类,再作为fact插入到workingmemory中去,这样倒是可以解决问题,但是需要设置两个pojo和hbm映射设置,并且实际上他们是同一个数据库表和同一种类,这么做似乎不妥...

谁能给点提示?我觉得我绕不出去了...
------解决方案--------------------
DAO访问数据库啊 居然把数据库访问脚本写在rule里~~~ 不能解耦合啊!
------解决方案--------------------
我仔细看了几遍楼主的规则代码,你提供的第三种方法看起来问题不大,能得到执行结果,但是却没有过滤掉其中的两种情况,我觉得是不是因为楼主的bin属性是String类型的原因,如果不是简单的基本数据类型,一定要用equlas啊,如果是String的类型,写eval表达式时,一定要用$bin1.equals($bin2)==false,而不是$bin1 != $bin2,这是不是问题的关键所在,楼主可以试下啊,另外,你的这种写法可以更简单一点,例如:
package com.sample
 
import com.sample.entity.TempEntity
import org.hibernate.Session;

rule "Hello World"
lock-on-active  
        when
        $session : Session()
        $temp1 : TempEntity($bin1:bin,name1:name) from $session.createQuery("from TempEntity").list()
        $temp2 : TempEntity($bin2:bin,name2:name) from $session.createQuery("from TempEntity").list()
        eval($bin1.equals($bin2)==false && name1.equals(name2) == true)  
友情提示:
信息收集于互联网,如果您发现错误或造成侵权,请及时通知本站更正或删除,具体联系方式见页面底部联系我们,谢谢。

其他相似内容:

热门推荐: