您当然可以进行空值检查。但是,如果这是被插入到数据库中的东西,则应该由数据库约束真正处理。
无论如何,将您的示例与一个对象 Person 和两个字段 personId 和 PersonNumber 一起使用(忽略其他字段,因为它们不是立即相关的。)我将假设该类及其 getter 如下所示:
class Person {
private Integer personId, PersonNumber;
public Integer getPersonId() {
return personId;
}
public Integer getPersonNumber() {
return PersonNumber;
}
}
然后你可以编写一个规则来检查是否有一个 PersonId 或 PersonNumber 为 null 的人:
rule "Person with either personId or PersonNumber null"
when
exists( Person( personId == null || personNumber == null ))
then
System.out.println("Person has either null personId or PersonNumber");
end
请注意,如果您想检查 personId 和 PersonNumber 是否为 null,则规则会有所不同;您不会使用 || 运算符,而是使用逗号和:
rule "Person with both personId and PersonNumber null"
when
exists( Person( personId == null, personNumber == null ))
then
System.out.println("Person has null personId and null PersonNumber");
end
或者,如果我误解了Primary key shouldn't be not null 的含义,以至于您希望字段为空,以便数据库可以自动设置它们,那么您可以反转空检查通过将exists 替换为not 来进行非空检查:
not( Person( personId == null || personNumber == null ))
not( Person( personId == null, personNumber == null ))
...或将== 换成!==。
至于您关于制定通用规则的问题,除非您要验证的所有对象都共享一个基类或接口,并且获取主键的方法是基类/接口。在理论上,您可以使用反射并创建Drools function 将一组请求的字段映射到空检查,但这似乎是一个非常糟糕的主意并且非常脆弱。