項(xiàng)目中用到樹結(jié)構(gòu),一般的需求是點(diǎn)擊一次,請(qǐng)求一次數(shù)據(jù)庫(kù),加載它的子節(jié)點(diǎn),但是現(xiàn)在有個(gè)需要,一次性加載所有節(jié)點(diǎn),這就需要查出節(jié)點(diǎn)的層次level,如果用Oracle數(shù)據(jù)庫(kù),可以用START WITH...CONNECT BY PRIOR子句實(shí)現(xiàn)遞歸查詢,但現(xiàn)在項(xiàng)目中用的是Mysql,ssh框架,苦想了好久,存儲(chǔ)過(guò)程中的查詢是不是也得按照hibernate的要求來(lái)寫,比如說(shuō),查詢實(shí)體類必須用from + 實(shí)體類,但是這個(gè)存儲(chǔ)過(guò)程是用中間表實(shí)現(xiàn)的,中間表是在存儲(chǔ)過(guò)程中創(chuàng)建的,沒(méi)有映射,這下子麻煩了,卡在這里,想了好久,最后還是決定試一試吧,寫完了存儲(chǔ)過(guò)程以后,用hibernate調(diào)用,嘿,成功,功夫不負(fù)有心人,實(shí)踐證明了hibernate調(diào)用存儲(chǔ)過(guò)程,存儲(chǔ)過(guò)程中的表不需要映射,直接查即可。
菜單樹結(jié)構(gòu)
BEGIN
DECLARE _level_var INT; //節(jié)點(diǎn)層次
DROP TABLE IF EXISTS temp_child_list; //中間表,其中的字段是程序中需要的字段。
CREATE TABLE temp_child_list (
_menuId int, //菜單id
_menuName varchar(100),
_menuLocType varchar(20),
_level int
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
SET _level_var = 0;
INSERT INTO temp_child_list (_menuId,_menuName,_menuLocType,_level) VALUE(rootid,'功能菜單','',_level_var);
SET _level_var = _level_var + 1;
INSERT INTO temp_child_list (_menuId,_menuName,_menuLocType,_level)
SELECT
menu_id,
menuName,
menuLocType,
_level_var
FROM
ele_sys_menu
WHERE
parent_id = rootid;
WHILE ROW_COUNT() > 0
DO
SET _level_var = _level_var + 1;
INSERT INTO temp_child_list SELECT
a.menu_id,
a.menuName,
a.menuLocType,
_level_var
FROM
ele_sys_menu a,
temp_child_list b
WHERE
a.parent_id = b._menuId
AND b._level = _level_var - 1;
END WHILE;
SELECT tcl._menuId,tcl._menuName,tcl._menuLocType,tcl._level FROM temp_child_list tcl ORDER BY tcl._level;
DROP TABLE IF EXISTS temp_child_list;
END
hibernate調(diào)用
SQLQuery query = this.getSession().createSQLQuery("{Call getChildMenu(-1)}");
List list = query.list();
返回結(jié)果為list,查出來(lái)很高興,于是接著往下做,強(qiáng)制轉(zhuǎn)換成什么類型呢,到這里又有問(wèn)題了,搜了點(diǎn)資料,發(fā)現(xiàn)需要這么干
public List selectMenuTreeAll() throws Exception {
SQLQuery query = this.getSession().createSQLQuery("{Call getChildMenu(-1)}");
query.addScalar("_menuId",Hibernate.INTEGER);
query.addScalar("_menuName",Hibernate.STRING);
query.addScalar("_menuLocType",Hibernate.STRING);
query.addScalar("_level",Hibernate.INTEGER);
List list = query.list();
List results = new ArrayList();
System.out.println(list.size()+"kkkkkkkkkkkkkkkk");
Iterator iterator = list.iterator();
while(iterator.hasNext()){
Object[] object = (Object[])iterator.next();
int menuId = (Integer)object[0];
System.out.println(menuId);
String menuName = (String)object[1];
System.out.println(menuName);
String menuLocType = (String)object[2];
System.out.println(menuLocType);
int level = (Integer)object[3];
System.out.println(level);
TempChildList childList = new TempChildList(menuId,menuName,menuLocType,level);
results.add(childList);
}
return results;
}
ok,搞定,這樣就好了。ok,perfect。
聯(lián)系客服