如何在Drools中实现类似SQL Join的关联查询?
在Drools中实现类似SQL Join的功能
你可以通过Drools的模式关联匹配实现类似SQL Join的效果,无需给ItemFact添加basketId字段。以下是正确的规则写法,以及你之前写法的问题分析:
正确的规则实现
收集符合条件的商品列表
如果需要将所有可用于购物篮5的ItemFact收集到一个列表中,可使用以下规则:
rule "Collect usable items for basket 5" when // 匹配购物篮5的可用商品标识记录 CanUseItemInBasket(basketId == 5, $targetItemId: orderItemId) // 关联对应的ItemFact(等价于SQL中的JOIN ON ItemFact.id = CanUseItemInBasket.orderItemId) $matchedItem: ItemFact(id == $targetItemId) // 收集所有匹配到的ItemFact到ArrayList $usableItems: ArrayList() from collect($matchedItem) then // 在这里处理收集到的可用商品列表 // 示例:输出列表内容 System.out.println("Items usable in basket 5: " + $usableItems); end
逐个处理符合条件的商品
如果不需要收集成列表,而是想逐个处理每一对关联的事实,可简化规则:
rule "Process each usable item for basket 5" when CanUseItemInBasket(basketId == 5, $targetItemId: orderItemId) $item: ItemFact(id == $targetItemId) then // 处理单个可用商品 System.out.println("Processing usable item: " + $item.getId()); end
你之前写法的问题
- 嵌套collect的写法:内层
collect(CanUseItemInBasket...)得到的是CanUseItemInBasket类型的集合,外层试图从中匹配ItemFact,类型不匹配,无法完成关联,因此无效。 - 双参数collect的写法:
collect语法仅支持单个模式参数,不能同时传入两个事实类型,这种写法本身不符合Drools规则语法,因此无法执行。
内容的提问来源于stack exchange,提问作者colorgreen
相关产品推荐
相关产品推荐

