日期:2014-05-18  浏览次数:21116 次

mybatis怎么做到二级级联查询?
做权限管理时候,菜单会有三级或者四级的情况。

pojo类代码片段如下:
public class Privilege implements Serializable{
private Long id;              
private String name;         
...
private List<Privilege> subPrivilege;

public List<Privilege> getSubPrivilege() {
return subPrivilege;
}
public void setSubPrivilege(List<Privilege> subPrivilege) {
this.subPrivilege = subPrivilege;
}
        ...


映射map片段如下:
<resultMap type="com.pojo.Privilege" id="privilege">
<id column="PRIVILEGE_ID" property="id" />
<result column="PRIVILEGE_NAME" property="name" />
<result column="PRIVILEGE_PARENT" property="parentId" />
<result column="PRIVILEGE_URL" property="url" />
<result column="PRIVILEGE_LEVEL" property="level" />
</resultMap>

<resultMap type="com.pojo.Privilege" id="subMap" extends="privilege">
<collection property="subPrivilege" ofType="com.pojo.Privilege" column="PRIVILEGE_ID"  select="getSubPriv"/>
</resultMap>

<select id="getSubPriv" parameterType="long" resultMap="privilege">  
        select p.* from PRIVILEGE p where p.PRIVILEGE_PARENT=#{id} order by p.PRIVILEGE_ID asc
    </select>  


service实现类中的代码片段如下:
public List<Privilege> getAllPrivilegeList() {
List<Privilege> firstLevelPrivilege = privilegeDao.getFirstPrivilegeList();
List<Privilege> allPrivList = new ArrayList<Privilege>();
if(firstLevelPrivilege != null && firstLevelPriv.size() != 0){
this.mergeSubPrivilege(allPrivList,firstLevelPriv);
}
return allPrivList;
}
private void mergeSubPrivilege(List<Privilege> allPrivList, List<Privilege> currPrivList) {
for (Privilege sub_priv : currPrivList) {
allPrivList.add(sub_priv);
if (sub_priv.getSubPrivilege() != null && sub_priv.getSubPrivilege().size() != 0) {
mergeSubPrivilege(allPrivList, sub_priv.getSubPrivilege());
}
}
}


问题就在这个service方法上。用递归调用组装allPrivList集合。debug发现只有PRIVILEGE_LEVEL为一级时候。他的subPrivilege集合属性能够查出来。再往下级递归的时候subPrivilege就都为null了。所以在页面上只能显示到二级目录,而三级,四级的出不来。以前项目都是用的hibernate,级联很方便。初次使用mybatis,摸索中前行。请高人指点!
------解决方案--------------------
mybatis是轻量级的框架,自己写sql语言完成各种功能,但个人觉得二级查询或三四级查询,mybatis不太方便,当然也能做,也是自动封装到list中,觉得挺麻烦,去网上找一下吧,很多的例子。另外做权限管理时,你也可以在程序中进行递归,不过性能不一定多好,但想想权限这东西也就这么十几条几十条的数据,这么做完全可以,性能影响并不明显。。。