- PR -

ツリー構造DBのデータを取得する方法(JAVA)

1
投稿者投稿内容
NAO
ベテラン
会議室デビュー日: 2003/09/24
投稿数: 51
投稿日時: 2004-06-25 14:48
いつもお世話になっています。

現在、悩んでいることがあります。
すでに、テーブルは存在していて、そのテーブルからツリー構造のデータを取得し、
ブラウザに表示を行なう形なのですが、初期表示時にすべての構造を取得し表示
したいと考えています。

○テーブル項目
「組織コード」
「組織名」
「上位組織コード」
※最上位の組織のみ上位組織コードはNULLです
※階層は無制限です。
※DB(oracle)

色々とプログラミングを試しているのですが、いったいどのようなプログラミング
をおこなえば、実現可能でしょうか?
階層が無制限というのが、自分の中でかなりネックになっています。
初歩的なプログラムの質問で申し訳ございませんが、よろしくおねがいします。
いっきゅう
大ベテラン
会議室デビュー日: 2004/04/04
投稿数: 153
お住まい・勤務地: 兵庫
投稿日時: 2004-06-25 15:06
http://www.atmarkit.co.jp/fnetwork/tokusyuu/01sql99/sql99_1b.html
このページの再帰SQLの項が参考になると思います。
tnk
会議室デビュー日: 2003/06/03
投稿数: 4
投稿日時: 2004-06-25 15:48
いつもいつも、参考にさせていただいています。

もし、Oracle9i以上を使われているなのでしたら、connect by句と
start with句を使うと簡単にできます。

もしかしたら、9iのR2以上かもしれません。その辺は、記憶があいまいで申し訳ありません。
シュン
ぬし
会議室デビュー日: 2004/01/06
投稿数: 328
お住まい・勤務地: 東京都
投稿日時: 2004-06-25 16:39
Javaプログラム内部でツリー構造を利用した処理をするわけですので、
ツリー構造の再構築をしておいたほうがよさそうに思いますが、いかがで
しょうか。

ちょっと興味があったのでためしに書いてみました。意外と簡単です。
NodeオブジェクトによるCompositeツリーですので、NodeにVisitorパタ
ーン等を適用しておけば、後の処理は何でもできそうです。

コード:

public class NodeTest{

static class Record{
public Integer id;public String name;public Integer pid;
public Record(Integer id,String name,Integer pid){
this.id = id;this.name = name;this.pid = pid;
}
}

private static final Record[] records = new Record[]{
new Record(new Integer(1),"ROOT",null),
new Record(new Integer(2),"NODE1",new Integer(1)),
new Record(new Integer(3),"NODE2",new Integer(1)),
new Record(new Integer(4),"NODE3",new Integer(1)),
new Record(new Integer(5),"NODE1-1",new Integer(2)),
new Record(new Integer(6),"NODE1-2",new Integer(2)),
new Record(new Integer(7),"NODE1-3",new Integer(2)),
new Record(new Integer(8),"NODE2-1",new Integer(3)),
new Record(new Integer(9),"NODE3-1",new Integer(4)),
new Record(new Integer(10),"NODE3-1-1",new Integer(9)),
new Record(new Integer(11),"NODE3-1-2",new Integer(9)),
new Record(new Integer(12),"NODE4",new Integer(1)),
new Record(new Integer(13),"NODE5",new Integer(1)),
};

public static void main(String args[]){

NodeParser parser = new NodeParser();
for(int i = 0 ; i < records.length; i++){
parser.addNodePath(records[i].id,records[i].name,records[i].pid);
}

Node root = parser.getRootNode();
root.dump();
}
}


class Node {

private Node parent = null;
private ArrayList children = new ArrayList();
private String name;
private Integer id;

public Node(Integer id){
this.id = id;
}
public void setName(String name){this.name = name;}
public String getName(){return name;}
public Integer getId(){return id;}
public void setParent(Node parent){this.parent = parent;}
public Node getParent(){return parent;}
public void addChild(Node child){this.children.add(child);}
public ArrayList getChildren(){return (ArrayList)children.clone();}

public String getPathName(){
return (parent != null)?
parent.getPathName()+"/"+getName():
getName();
}

public void dump(){
System.out.println(getPathName());
for(Iterator iter = children.iterator();iter.hasNext():wink:{
((Node)iter.next()).dump();
}
}
}

class NodeParser{

private HashMap nodemap = new HashMap();

public void addNodePath(Integer id,String name,Integer pid){

Node node = (Node)nodemap.get(id);
if(node == null){
node = new Node(id);
nodemap.put(id,node);
}
node.setName(name);

if(pid == null)return;

Node pnode = (Node)nodemap.get(pid);
if(pnode == null){
pnode = new Node(pid);
nodemap.put(pid,pnode);
}

node.setParent(pnode);
pnode.addChild(node);

}

public Node getRootNode(){
for(Iterator iter = nodemap.values().iterator();iter.hasNext():wink:{
Node node =(Node)iter.next();
if(node.getParent() == null)return node;
}
return null;
}
}




[ メッセージ編集済み 編集者: シュン 編集日時 2004-06-25 16:58 ]

バグがあったので修正。



[ メッセージ編集済み 編集者: シュン 編集日時 2004-06-25 17:00 ]
カーニー
ぬし
会議室デビュー日: 2003/09/04
投稿数: 358
お住まい・勤務地: 東京
投稿日時: 2004-06-25 18:31
こんにちは、カーニーです。

引用:

tnkさんの書き込み (2004-06-25 15:48) より:
もし、Oracle9i以上を使われているなのでしたら、connect by句と
start with句を使うと簡単にできます。

もしかしたら、9iのR2以上かもしれません。その辺は、記憶があいまいで申し訳ありません。



CONNECT BY句による階層問合せは、どのバージョンからかは知りませんが、少なくともOracle7の頃から使用できる構文です。

ただしそれだけだと二次元の結果セットが返ってくるだけなので、それをJavaからツリー構造で操作するには、シュンさんが挙げられているようなデータ構造にマッピングしてあげないといけないかもしれません。
1

スキルアップ/キャリアアップ(JOB@IT)