O/Rマッピングの結果のとり方
O/Rマッピングの結果のとり方について質問があったので、若干詳しく説明を書こうと思います。
サンプルプロジェクトの、ChildrenManagerクラスの中に
public class ChildrenManager extends ChildrenManagerInternal {
private List children = new LinkedList();
private List toy = new LinkedList();
という部分があると思います。
(サンプルプロジェクトは、CROSSFIRE O/R トップページのデモで使われているものです。)
このクラスは、
SELECT
*
FROM
CHILDREN LEFT JOIN TOY ON CHILDREN.ID = TOY.OWNER
WHERE
CHILDREN.ID = '$id'
AND CHILDREN.NAME = '$name'
というSQLを実行するselectChildren()メソッドを持っています。
ChildrenManager クラスのメンバーのchildren は、Childrenクラスのオブジェクトのリスト、toy はToyクラスのオブジェクトのリストです。
このリストは、SELECT文を実行後、次のSELECT文が実行されるまでの間、O/Rマッピングした結果を溜めておく(プールする)ものです。
// Select
ChildrenManager childrenManager = new ChildrenManager();
Hashtable input = new Hashtable();
//input.put("id", "0");
//input.put("name", "Tom");
List result = childrenManager.selectChildren(con, input, null, null);
ここまで実行すると、ChildrenManager クラスのオブジェクト内部でO/Rマッピングが実行され、さきほど説明した結果をためておくためのリストにO/RマッピングされたJavaBeanがプールされます。
あとは、O/Rマッピングされた結果が欲しい場合には、getterを使って、このプールされているJavaBeanのリストを取り出せばOKです。
例えば、Childのリストが欲しい場合は
List childList = childrenManager.getChildren();
とすれば、Childが取れます。
O/Rマッピングした結果だけが欲しい場合には、selectChildren()メソッドの戻り値のHashtableのリストは使いません。
ちなみに、ここで取得できるChildとToyオブジェクトの外部キーに関する参照もきちんとセッティングされています。
なぜ、戻り値でこれらのオブジェクトを返す仕様にしかなったかというと、テーブルをJOINした際に、返されるオブジェクトのリストが2つ以上になるからです。
(Basic版では2つまで)
みなさん、質問や、こんな風に作って欲しいというのがありましたら、どしどし、info@crossfire.jpまでメールください。
よろしくお願いします。