sql和java中的PreparedStatementCallback List roles=jdbcTemplate.queryForList(“从user_-roles中选择role_-id,其中user_-id=?”,新对象[]{id}); 字符串roleIds=“”; 对于(int i=0;i

sql和java中的PreparedStatementCallback List roles=jdbcTemplate.queryForList(“从user_-roles中选择role_-id,其中user_-id=?”,新对象[]{id}); 字符串roleIds=“”; 对于(int i=0;i,java,sql,list,map,Java,Sql,List,Map,我的错误日志: PreparedStatementCallback; 错误的SQL语法[select u.id、u.user\u id、count(distinct pf.id)、IfNULL(upm.GROUP\u autoassign\u enable,true)来自用户u 内部连接用户角色ur在ur上。用户id=u.id左外部连接 用户\首选项\管理u.id上的upm=upm.id内部联接 mh.child\u id=u.id或mh.role\u id上的管理层次结构mh =ur.role

我的错误日志:

PreparedStatementCallback; 错误的SQL语法[select u.id、u.user\u id、count(distinct pf.id)、IfNULL(upm.GROUP\u autoassign\u enable,true)来自用户u 内部连接用户角色ur在ur上。用户id=u.id左外部连接 用户\首选项\管理u.id上的upm=upm.id内部联接 mh.child\u id=u.id或mh.role\u id上的管理层次结构mh =ur.role\u id left-outer-join(jbpm4\u-task jt-internal-join-process\u-flow pf on-pf.pid=jt.execution\u id\u和pf.apprum\u-mgmt\u id不为空) 在jt.assignee u=u.user\u id上,其中mh.parent\u id=?或mh.role\u id位于 ([{role\u id=2},{role\u id=4},{role\u id=1},{role\u id=8},{role\u id=38}, {role_id=22}、{role_id=69}、{role_id=2}、{role_id=4}、{role_id=1}, {role_id=8}、{role_id=38}、{role_id=22}、{role_id=69}、{role_id=2}, {role_id=4},{role_id=1},{role_id=8},{role_id=38},{role_id=22}, {role_id=69}],{role_id=2},{role_id=4},{role_id=1},{role_id=8}, {role_id=38}、{role_id=22}、{role_id=69}、{role_id=2}、{role_id=4}, {role_id=1},{role_id=8},{role_id=38},{role_id=22}, {role_id=69}],{role_id=2},{role_id=4},{role_id=1},{role_id=8}, {role_id=38}、{role_id=22}、{role_id=69}、{role_id=2}、{role_id=4}, {角色id=1}、{角色id=8}、{角色id=38}、{角色id=22}、{角色id=69}]) 按u.id分组,u.USERUID按计数排序(pf.id)]; 嵌套异常是com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:您有一个 SQL语法错误;检查与您的产品相对应的手册 在“[{role\u id=2}”附近使用正确语法的MySQL服务器版本, {role_id=4}、{role_id=1}、{role_id=8}、{role_id=38}、{role_id=22},'at 第1行


输出映射值列表的逻辑中有一个错误。您输出的是整个映射,而不是您想要的一个值

更改此行:

List<Integer> roles = jdbcTemplate.queryForList("select role_id from user_roles where user_id = ?" , new Object[]{id});

    String roleIds= "";

    for (int i= 0; i < roles.size(); i++)
    {

           }            if (roles.get(i) != null) {
            if(i!=0){
                roleIds += "," + m.get(i) ;
            }else{
                roleIds += m.toString() ;
            }
        }
    }

    String queryString= "select u.id,u.user_id,count(distinct pf.id),IfNULL(upm.grievance_autoassign_enable,true) "+
            " from users u "+  
            " inner join user_roles ur on ur.user_id=u.id " +
            " left outer join user_preference_management upm on u.id = upm.id "+
            " inner  join management_hierarchy mh on mh.child_id = u.id or mh.role_id =ur.role_id "+  
            " left outer join ( jbpm4_task  jt "+ 
            " inner join process_flow pf on pf.pid = jt.execution_id_ and pf.grievance_mgmt_id is not null)  on jt.assignee_ = u.user_id "+
            " where mh.parent_id = ? "+ (roleIds != null ? " or mh.role_id in (" + roleIds + ")" : "") +
            " group by u.id,u.user_id  order by count(pf.id) ";

    return executeDBSummaryWithAutoAssign(queryString,new Object[] {id});
    }
致:


您可能需要提供更多详细信息,但异常情况表明您的SQL语法不正确。请尝试打印
queryString
并单独运行它。确保您的数组是您想要的。我有一种感觉,它不认为您有额外的
}
,在它到达之前关闭
for
循环if语句。可能是错误的代码?或者它在您的代码中看起来确实是这样的吗?检查您前面的问题,了解如何获取角色ID:
m
没有在任何地方声明。@DavidConrad根据对它的调用和生成的输出,它是一个必须在别处定义的映射。如果您阅读了代码,他在附近正确地使用了它问题行。我同意这一定是一个映射,但我认为他没有正确使用它。如果映射确实包含类似
{role\u id=22}
的内容,他将不得不使用
m.get(“role\u id”)
m.get(I)
只会给出
null
roleIds += m.toString();
roleIds += m.get(i);