2017-03-10 7 views
0

私は、関連する部門のリストを持つ学生クラスを持っています。カスタムオブジェクトのリスト内の状態でのドル記号のルール

public class Student { 

    private String name; 
    private String desc; 
    private List<Department> department = new ArrayList<Department>(); 
} 

public class Department { 

    private String name; 
    private String desc; 
} 

私はDroolsで書き込みルールを試しています。ルールは次のようなものです - 学生が特定の部署に所属している場合、行動を起こします。私はそれを行う正しい方法を理解することができません。私が下に書いたものはうまくいきません。私はそれが弦のリストの場合にはうまくいくと思います。カスタムオブジェクトのcontainsを実行する方法はありますか?ルール

   Student student = new Student(); 
       student.setName("John"); 
       Department a1 = new Department(); 
       a1.setName("English"); 
       student.addDepartment(a1); 
       Department a2 = new Department(); 
       a2.setName("French"); 
       student.addDepartment(a2); 
       System.out.println("Student :" + student); 
       ksession.insert(student); 
       ksession.fireAllRules(); 

を呼び出すため

rule "Language" 

when 
    $student : Student(department contains "English" && department contains "French") 

then 
    System.out.println("Belongs to Language"); 

エンド

コードIは、Droolsの6.2バージョンを使用しています。

答えて

0

List<Department>の文字列を検索することはできません。 nameフィールドがこれらの2つの値のいずれかであるメンバーを探す必要があります。

rule "Language" 
when 
    $student: Student($dep: department) 
    Department(name == "French" || == "English", 
       this memberOf $dep) 
then 
    System.out.println("Belongs to Language"); 
end 

編集:あなたは、同様の事実として、部門オブジェクトを挿入する必要があります。

学生が両方の言語を持っている場合は、

rule "Language" 
when 
    $student: Student($dep: department) 
    Department(name == "French", this memberOf $dep) 
    Department(name == "English", this memberOf $dep) 
then 
    System.out.println("Belongs to Language"); 
end 
+0

感謝のラウンを使用しています。私はこのルールを実行しようとしましたが、アクション部分にsysoutを表示しません。問題が何であるか分かりません。また、私の条件は、学生は英語とフランス語の両方に属していなければなりませんでした。彼は言語部門に所属しています。彼が英語と数学に属していれば、このルールは解雇されるべきではありません。問題のコードを更新しました。 – Arul

+0

追加したコードは、Departmentオブジェクトをファクトとして挿入していないことを示しています。答えを編集しました。 – laune

関連する問題