@Query(nativeQuery = true, value = "SELECT m1.id AS id, m1.icon AS icon, ( CASE WHEN (m2.id = 0 OR m2.id IS NULL) " +
"THEN 0 ELSE m2.id END ) AS parentId, m1. NAME AS NAME, m1.url AS url, m1.levels AS levels, m1.ismenu AS " +
"ismenu, m1.num AS num, m1. CODE AS CODE,m1.component,m1.hidden FROM t_sys_menu m1 LEFT JOIN t_sys_menu m2 " +
"ON " +
"m1.pcode = m2. CODE " +
" where m1.id in (select distinct(menuid) from t_sys_relation where roleid in(?))" +
"ORDER BY levels, num ASC")
List getMenusByRoleids(String roleIds);
如果修改了entity的id为String后,在加载菜单的时候会加载不到菜单
从Menuservice传进来的代码时一个数组拼接成的字符串,之前是数字的时候不会报错,但是现在变成字符串了就会报错
但是到了这里用的是?号通配符
这样如果ids 字符串是 1,2,3 那么查询语句就变成了 roleid in ('1,2,3')
结果导致前端加载不到菜单.
所以这里修改成下面这样
@Query(nativeQuery = true,value="SELECT m1.id AS id, m1.icon AS icon, ( CASE WHEN (m2.id = '0' OR m2.id IS NULL) " +
"THEN '0' ELSE m2.id END ) AS parentId, m1. NAME AS NAME, m1.url AS url, m1.levels AS levels, m1.ismenu AS " +
"ismenu, m1.num AS num, m1. CODE AS CODE,m1.status as status,m1.component,m1.hidden FROM t_sys_menu m1 LEFT JOIN t_sys_menu m2 " +
"ON " +
"m1.pcode = m2. CODE " +
" where m1.id in (select distinct(menuid) from t_sys_relation where roleid in(:roleIds))"+
"ORDER BY levels, num ASC")
List getMenusByRoleids(@Param("roleIds") List<String>roleIds); //这里直接传递list就好了
public List getSideBarMenus(List roleIds) {
/
这里也不用将角色ID转换成字符串了 这段代码可以注释掉
StringBuilder builder = new StringBuilder();
for(int i=0;i<roleIds.size();i++){
if(i==roleIds.size()-1){
builder.append(roleIds.get(i));
}else {
builder.append(roleIds.get(i)).append(",");
}
}/
List<RouterMenu> list = transferRouteMenu(menuRepository.getMenusByRoleids(roleIds));
// List list = transferRouteMenu(menuRepository.getMenusByRoleids(builder.toString())); //这里使用上面的语句
List result = generateRouterTree(list);
for (RouterMenu menuNode : result) {
if (!menuNode.getChildren().isEmpty()) {
sortRouterTree(menuNode.getChildren());
for (RouterMenu menuNode1 : menuNode.getChildren()) {
if (!menuNode1.getChildren().isEmpty()) {
sortRouterTree(menuNode1.getChildren());
}
}
}
}
sortRouterTree(result);
return result;
}
https://github.com/enilu/web-flash/blob/f4c921e2dc89ec2f77e965578709f259b7f0c54d/flash-core/src/main/java/cn/enilu/flash/dao/system/MenuRepository.java#L41
@Query(nativeQuery = true, value = "SELECT m1.id AS id, m1.icon AS icon, ( CASE WHEN (m2.id = 0 OR m2.id IS NULL) " + "THEN 0 ELSE m2.id END ) AS parentId, m1. NAME AS NAME, m1.url AS url, m1.levels AS levels, m1.ismenu AS " + "ismenu, m1.num AS num, m1. CODE AS CODE,m1.component,m1.hidden FROM t_sys_menu m1 LEFT JOIN t_sys_menu m2 " + "ON " + "m1.pcode = m2. CODE " + " where m1.id in (select distinct(menuid) from t_sys_relation where roleid in(?))" + "ORDER BY levels, num ASC") List getMenusByRoleids(String roleIds); 如果修改了entity的id为String后,在加载菜单的时候会加载不到菜单 从Menuservice传进来的代码时一个数组拼接成的字符串,之前是数字的时候不会报错,但是现在变成字符串了就会报错 但是到了这里用的是?号通配符 这样如果ids 字符串是 1,2,3 那么查询语句就变成了 roleid in ('1,2,3') 结果导致前端加载不到菜单. 所以这里修改成下面这样
public List getSideBarMenus(List roleIds) {
/
这里也不用将角色ID转换成字符串了 这段代码可以注释掉 StringBuilder builder = new StringBuilder(); for(int i=0;i<roleIds.size();i++){ if(i==roleIds.size()-1){ builder.append(roleIds.get(i)); }else { builder.append(roleIds.get(i)).append(","); } }/
// List list = transferRouteMenu(menuRepository.getMenusByRoleids(builder.toString())); //这里使用上面的语句
List result = generateRouterTree(list);
for (RouterMenu menuNode : result) {
if (!menuNode.getChildren().isEmpty()) {
sortRouterTree(menuNode.getChildren());
for (RouterMenu menuNode1 : menuNode.getChildren()) {
if (!menuNode1.getChildren().isEmpty()) {
sortRouterTree(menuNode1.getChildren());
}
}
}
}
sortRouterTree(result);
return result;
}