一个表中有id   和上及id  !我现在要根据一个id等到所有他的下级!但不知道有多少及!  
   谁有例子请发个过来!  最好是 HQL的!

解决方案 »

  1.   

    你可以SQL专区去问这个问题哦。
      

  2.   

    public class LayoutTypeTool extends Observable implements ILayoutTypeTool {
    //层次桶
    protected Map layoutTypes = new LinkedMap();
    //类型桶
    protected Map types = new LinkedMap();
    //dao
    private ILayoutTypeDAO layoutDao;
    //rootType
    private ILayoutType root_type;
    //数据改变观察者
    private ILayoutTypeDataChangeListener dataChangeListener;
    //根节点名
    public static final String ROOT_NAME = "_root"; 

    public LayoutTypeTool(){

    }

    /**
     * 加载数据
     */
    public synchronized void load(){
    types = getAllTypes();
    Map parserTypes = new LinkedMap(types);
    ILayoutType rootType = this.getRootType();
    layoutTypes.clear();
    parserType(parserTypes,rootType.getTypeId(),layoutTypes);
    }

    /**
     * 根节点检查,如果没有根节点就添加一个
     *
     */
    private Map getAllTypes(){
    Map types = this.layoutDao.loadDataFromDB(null);
    boolean findRoot = false;
    Iterator itType = new LinkedList(types.values()).iterator();
    while(itType.hasNext()){
    ILayoutType layoutType = (ILayoutType)itType.next();
    if(layoutType.getTypeName().equals(ROOT_NAME)){
    findRoot = true;
    break;
    }
    }
    if(!findRoot){
    //添加根节点
    ILayoutType rootType = 
    this.layoutDao.addRootLayoutTypeToDB(ROOT_NAME);
    //将所有没有父节点的一级节点置于根节点下
    types = this.layoutDao.loadDataFromDB(null);
    itType = new LinkedList(types.values()).iterator();
    while(itType.hasNext()){
    ILayoutType layoutType = (ILayoutType)itType.next();
    if(layoutType.getParentTypeId()==null&&
    !layoutType.getTypeName().equals(ROOT_NAME)){
    layoutType.setParentTypeId(rootType.getTypeId());
    this.layoutDao.updateLayoutTypeToDB(layoutType);
    }
    }
    types = this.layoutDao.loadDataFromDB(null);
    }

    return types;
    }

    /**
     * 递归收集某类型的所有子类型,入该类型层次桶,并将桶返回
     * 
     * @param types
     * @param parseTypeId
     * @return
     */
    private void parserType(Map types,Object parseTypeId,Map layoutMap){
    Iterator itTypes = new LinkedList(types.values()).iterator();
    while(itTypes.hasNext()){
    ILayoutType type = (ILayoutType)itTypes.next();
    if(type.getParentTypeId()!=null
    &&type.getParentTypeId().equals(parseTypeId)){
    Object layoutTypeId = type.getTypeId();
    layoutMap.put(layoutTypeId,null);
    types.remove(layoutTypeId);
    }
    }
    Iterator itChildrenTypeId = layoutMap.keySet().iterator();
    while(itChildrenTypeId.hasNext()){
    Object childTypeId = itChildrenTypeId.next();
    Map childLayoutMap = new LinkedMap();
    layoutMap.put(childTypeId,childLayoutMap);
    parserType(types,childTypeId,childLayoutMap);
    }
    }

    // /**
    //  * 递归收集某类型的所有子类型,入该类型层次桶,并将桶返回
    //  * 
    //  * @param types
    //  * @param parseTypeId
    //  * @return
    //  */
    // private Map parserType(List types,Object parseTypeId){
    //   //提取当前层的子集
    // Map oneLayoutTypes = new LinkedMap();
    // //递归收集所有子类型入层次桶
    // for(int i=0;types!=null&&i<types.size();){
    // ILayoutType type = (ILayoutType)types.get(i);
    // //遍历类型集合,如果是解析类型的子类型则递归解析子类型,并将子类型入层次桶
    // if(type.getParentTypeId()!=null
    // &&type.getParentTypeId().equals(parseTypeId)){
    // //移出集合
    // Object layoutTypeId = type.getTypeId();
    // types.remove(i);
    // //递归解析子类型
    // Map childCarTypes = parserType(types,layoutTypeId);
    // //将解析过的子类型入该类型层次桶
    // oneLayoutTypes.put(layoutTypeId,childCarTypes);
    // //找到子类型则重新遍历过
    // i=0;
    // }else{
    // //遍历下一个
    // i++;
    // }
    // }
    // return oneLayoutTypes;
    // }

    /**
     * 添加一个类型
     * @param type
     * @return
     */
    public synchronized Object addLayoutType(ILayoutType add_type){
    if(add_type==null) return null;
    Object typeId = null;
    //添加类型到数据库
    ILayoutType type = layoutDao.addLayoutTypeToDB(add_type);
    if(type!=null){
    Object parentId = type.getParentTypeId();
    //进层次桶
    typeId = type.getTypeId();
    Map parentLayout = this.getAnyLayoutMap(parentId);
    parentLayout.put(typeId,new LinkedMap());
    //进类型桶
    types.put(typeId,type);
    //通知观察者
    if(this.dataChangeListener!=null){
    this.setChanged();
    this.notifyObservers(ILayoutTypeDataChangeListener.ADD_DATA);
    }
    }

    return typeId;
    }
      

  3.   

    /**
     * 更改一个类型
     * @param type
     * @return
     */
    public synchronized boolean updateLayoutType(ILayoutType update_type){
    if(update_type==null) return false;
    //得到原类型
    ILayoutType srcUpdateType = this.getLayoutType(update_type.getTypeId());
    //更新数据库
    boolean updateType = layoutDao.updateLayoutTypeToDB(update_type); 
    if(updateType){
    //如果层次关系改变
    if(srcUpdateType.getParentTypeId()!=null&&
    update_type.getParentTypeId()!=null&&srcUpdateType.
    getParentTypeId().equals(update_type.getParentTypeId())){
    //从原桶移出
    Map srcParentMap = 
    this.getAnyLayoutMap(srcUpdateType.getParentTypeId());
    Map updateMap = (Map)srcParentMap.remove(update_type.getTypeId());
    //添加到新桶
    Map targetParentMap = 
    this.getAnyLayoutMap(update_type.getParentTypeId());
    targetParentMap.put(update_type.getTypeId(),updateMap);
    }
    //进类型桶
    types.put(update_type.getTypeId(),update_type);
    //通知观察者
    if(this.dataChangeListener!=null){
    this.setChanged();
    this.notifyObservers(ILayoutTypeDataChangeListener.UPDATE_DATA);
    }
    }

    return updateType;
    }

    /**
     * 删除一个类型
     * @param typeId
     * @return
     */
    public synchronized boolean deleteLayoutType(Object typeId) throws HasChildTypeException{
    Map childType = this.getAnyLayoutMap(typeId);
    if(childType.size()>0) throw new HasChildTypeException(
    "该类型有子类型,请将子类型删除再对删除该类型,类型id="+typeId);
    boolean deleteOk = layoutDao.deleteLyoutTypeToDB(typeId);
    if(deleteOk){
    ILayoutType type = (ILayoutType)this.types.remove(typeId);
    //从层次桶中移除
    Map parentMap = this.getAnyLayoutMap(type.getParentTypeId());
    parentMap.remove(typeId);
    //通知观察者
    if(this.dataChangeListener!=null){
    this.setChanged();
    this.notifyObservers(ILayoutTypeDataChangeListener.DELETE_DATA);
    }
    }

    return deleteOk;
    }

    /**
     * 删除一棵类型树:类型及其底下的所有子类型
     * @param typeId
     * @return
     */
    public synchronized boolean deleteLayoutTypeTree(Object typeId){
    Map allLayoutChildTypeIds = this.getAllLayoutChildTypeIds(typeId);
    boolean isDelete =
    this.layoutDao.deleteLayoutTypeToDB(allLayoutChildTypeIds.keySet());
    if(isDelete){
    this.load();
    }

    return isDelete;
    }

    /**
     * 
     * @param typeId
     * @return
     */
    private Map getAllLayoutChildTypeIds(Object typeId){
    Map allLayoutChildTypeIds = new LinkedMap();
    Map childTypes = this.getAnyLayoutMap(typeId);
    Iterator itChildTypes = childTypes.keySet().iterator();
    while(itChildTypes.hasNext()){
    Object childTypeId = itChildTypes.next();
    Map childLayoutTypeIds = this.getAllLayoutChildTypeIds(childTypeId);
    allLayoutChildTypeIds.putAll(childLayoutTypeIds);
    }
    allLayoutChildTypeIds.put(typeId,null);

    return allLayoutChildTypeIds;
    }

    /**
     * 根据id得到某一类型
     * @param typeId
     * @return
     */
    public ILayoutType getLayoutType(Object typeId){
    ILayoutType type = (ILayoutType)types.get(typeId);
    if(type==null) return null;
    return type.copyLayoutType();
    }

    /**
     * 根据类型名得到某一类型
     * @param typeName
     * @return
     */
    public ILayoutType getLayoutType(String typeName){
    return null;
    }
      

  4.   

    /**
     * 得到所有类型
     * @return
     */
    public Iterator getAllLayoutTypes(){
    List srcTypes = new LinkedList(types.values());
    Iterator itTypes = srcTypes.iterator();
    List tmpTypes = new LinkedList();
    while(itTypes.hasNext()){
    ILayoutType type = (ILayoutType)itTypes.next();
    tmpTypes.add(type.copyLayoutType());
    }

    srcTypes.clear();
    return tmpTypes.iterator();
    }

    /**
     * 得到某类型的递归类型
     * @param typeId
     * @return
     */
    public ILayoutType[] getLayoutTypePath(Object typeId){
    ILayoutType[] types = null;
    try{
    Object[] typePath = this.getLayoutPath(typeId);
    types = new ILayoutType[typePath.length];
    for(int i=0;i<types.length;i++){
    types[i] = this.getLayoutType(typePath[i]);
    }
    }catch(Exception e){
    e.printStackTrace();
    }

    return types;
    }

    /**
     * 得到某类型的递归id路径
     * @param typeId
     * @return
     */
    private Object[] getLayoutPath(Object typeId) throws Exception{
    if(!types.containsKey(typeId))
    throw new Exception("所有层车型分类中找不到该车型,车型标识是==" + typeId);
    //得到类型对象
    int layout = 0;
    Object [] typeIds = new Object[10];
    typeIds[layout++] =  typeId;
    //得到所有父层类型的id
    ILayoutType type = (ILayoutType)types.get(typeId);
    while(type.getParentTypeId()!=null){
    Object id = type.getParentTypeId();
    type = (ILayoutType)types.get(id);
    typeIds[layout++] = type.getTypeId();
    }
    Object[] path = new Object[layout-1];
    for(int i=layout-2,j=0;i>=0;i--,j++){
    path[j] = typeIds[i];
    }

    return path;
    }

    /**
     * 得到根层次桶
     * @return
     */
    public Map getRootLayoutMap(){
    return this.layoutTypes;
    }

    /**
     * 得到任意类型的层次桶
     * @param typeId
     * @return
     */
    public Map getAnyLayoutMap(Object typeId){
    Map layoutMap = new LinkedMap();
    ILayoutType[] types = this.getLayoutTypePath(typeId);
    try{
    layoutMap = this.getAnyLayoutMap(types);
    }catch(Exception e){
    e.printStackTrace();
    }

    return layoutMap;
    }

    /**
     * 根据类型标识路径得到该层的分层桶
     * 
     * @param carTypeIds
     * @return
     * @throws Exception
     */
    private synchronized Map getAnyLayoutMap(ILayoutType[] types) throws Exception{
    Map layoutMap = this.layoutTypes;

    int j=0;
    for(int i=0;i<types.length;i++){
    ILayoutType type = types[i];
    Object typeId = type.getTypeId();
    if(!layoutMap.containsKey(typeId)){
    throw new Exception(
    "第"+(j++)+"层找不到该类型,类型标识是=="+typeId);
    }
    layoutMap = (Map)layoutMap.get(typeId);
    }

    return layoutMap;
    }

    /**
     * 得到任意类型的子类型
     * @param typeId
     * @return
     */
    public Iterator getAnyLayoutTypes(Object typeId){
    List layoutTypes = new LinkedList();
    Map typeLayoutMap = this.getAnyLayoutMap(typeId);
    Iterator itChildrenTypeIds = typeLayoutMap.keySet().iterator();
    while(itChildrenTypeIds.hasNext()){
    Object type = this.getLayoutType(itChildrenTypeIds.next());
    if(type!=null)
    layoutTypes.add(type);
    }

    return layoutTypes.iterator();
    }

    /**
     * 返回根类型
     * 根类型约定:ILayoutType的parentTypeId为null的认为是根类型
     * @return
     */
    public ILayoutType getRootType(){
    if(root_type==null){
    Iterator itTypes = new LinkedList(types.values()).iterator();
    while(itTypes.hasNext()){
    ILayoutType type = (ILayoutType)itTypes.next();
    if(type.getParentTypeId()==null){
    root_type = type;
    break;
    }
    }
    }

    return root_type;
    } public ILayoutTypeDAO getLayoutDao() {
    return layoutDao;
    } public void setLayoutDao(ILayoutTypeDAO layoutDao) {
    this.layoutDao = layoutDao;
    this.load();
    } public ILayoutTypeDataChangeListener getDataChangeListener() {
    return dataChangeListener;
    } public void setDataChangeListener(ILayoutTypeDataChangeListener dataChangeListener) {
    this.dataChangeListener = dataChangeListener;
    }
    }