一个超级头痛的问题有一个树形结构的域列表,bu为一个域对象,getBuById为返回一个BU对象,getSubBus()函数求子域列表LIST,中间递归调用了getBuById函数,Bu对象的结构如下,
public class Bu {
/** 域或子域的编码 */
private int buId; /** 域或子域的名称 */
private java.lang.String buName; /** 域的子域列表。 */
private List subBus; /** 域或子域的父域。 */
private Bu parentBu;
}问题是如果调用getSubBus()后,再求父域BU,会进入递归死循环,打个比方,根域1有子域2和3,求1的子域为2和3,程序到了2这个地方后,又会返回来找到父域1,然后1又会找子域为2,3,如此类推,
如此看来,求子域的LIST和求父域的BU不能同时出现呀,烦呀,各位高人,有什么好办法吗?部分源码
public Bu getBuById(int buId) throws Exception {
Connection conn = null;
PreparedStatement stmt = null;
ResultSet rs = null;
String sql = "select PK_BUID,FK_ParentId from Am_Bu where PK_BuId="
+ buId;
Bu bu = new Bu();
try {
conn = DBConnect.gentconnect();
stmt = conn.prepareStatement(sql);
rs = stmt.executeQuery();
if (rs.next()) {
bu.setBuId(buId);
bu.setBuName(rs.getString("NAME"));
bu.setSubBus(getSubBus(buId));
bu.setParentBu(getBuById(rs.getInt("FK_PARENTID")));
}
} catch (SQLException ex) {
ex.printStackTrace();
} finally {
conn.close();
}
return bu;
}
public List getSubBus(int buId) throws Exception {
Connection conn = null;
PreparedStatement stmt = null;
ResultSet rs = null;
List list = new ArrayList();
String sql = "SELECT FK_BuId FROM AM_BUPARENT_LINK WHERE FK_ParentId="
+ buId + " and FK_BUID<>" + buId;
try {
conn = DBConnect.gentconnect();
stmt = conn.prepareStatement(sql);
rs = stmt.executeQuery();
Bu bu = new Bu();
while (rs.next()) {
bu = getBuById(rs.getInt("FK_BUID"));
list.add(bu);
}
} catch (SQLException ex) {
ex.printStackTrace();
} finally {
conn.close();
}
return list;
}
public class Bu {
/** 域或子域的编码 */
private int buId; /** 域或子域的名称 */
private java.lang.String buName; /** 域的子域列表。 */
private List subBus; /** 域或子域的父域。 */
private Bu parentBu;
}问题是如果调用getSubBus()后,再求父域BU,会进入递归死循环,打个比方,根域1有子域2和3,求1的子域为2和3,程序到了2这个地方后,又会返回来找到父域1,然后1又会找子域为2,3,如此类推,
如此看来,求子域的LIST和求父域的BU不能同时出现呀,烦呀,各位高人,有什么好办法吗?部分源码
public Bu getBuById(int buId) throws Exception {
Connection conn = null;
PreparedStatement stmt = null;
ResultSet rs = null;
String sql = "select PK_BUID,FK_ParentId from Am_Bu where PK_BuId="
+ buId;
Bu bu = new Bu();
try {
conn = DBConnect.gentconnect();
stmt = conn.prepareStatement(sql);
rs = stmt.executeQuery();
if (rs.next()) {
bu.setBuId(buId);
bu.setBuName(rs.getString("NAME"));
bu.setSubBus(getSubBus(buId));
bu.setParentBu(getBuById(rs.getInt("FK_PARENTID")));
}
} catch (SQLException ex) {
ex.printStackTrace();
} finally {
conn.close();
}
return bu;
}
public List getSubBus(int buId) throws Exception {
Connection conn = null;
PreparedStatement stmt = null;
ResultSet rs = null;
List list = new ArrayList();
String sql = "SELECT FK_BuId FROM AM_BUPARENT_LINK WHERE FK_ParentId="
+ buId + " and FK_BUID<>" + buId;
try {
conn = DBConnect.gentconnect();
stmt = conn.prepareStatement(sql);
rs = stmt.executeQuery();
Bu bu = new Bu();
while (rs.next()) {
bu = getBuById(rs.getInt("FK_BUID"));
list.add(bu);
}
} catch (SQLException ex) {
ex.printStackTrace();
} finally {
conn.close();
}
return list;
}
getBuById(int buId,boolean ifGetSub),正常调用ifGetSub取true,子域调用ifGetSub取false.
然后再修改getBuById:
...
bu.setBuId(buId);
bu.setBuName(rs.getString("NAME"));
if(ifGetSub) //加入的语句
bu.setSubBus(getSubBus(buId));
bu.setParentBu(getBuById(rs.getInt("FK_PARENTID"),false));//同时修改这句
...
就不会死循环了。