Java Mybatis-迭代属于ArrayList的HashMap的键/值

Java Mybatis-迭代属于ArrayList的HashMap的键/值,java,xml,mybatis,spring-mybatis,Java,Xml,Mybatis,Spring Mybatis,我有一个项目需要处理SQL的动态排序人员 我试图使用一个包含排序命令的映射列表,使用它可以保持排序顺序和排序目标 Java代码: 排序部分: List<Map<String, String>> sort = new ArrayList<>(); // the key is the field of table which i want to sort // and the value here is the sort order (asc/desc) Ma

我有一个项目需要处理SQL的动态排序人员

我试图使用一个包含排序命令的映射列表,使用它可以保持排序顺序和排序目标

Java代码: 排序部分:

List<Map<String, String>> sort = new ArrayList<>();

// the key is the field of table which i want to sort
// and the value here is the sort order (asc/desc) 
Map<String, String> map1 = new HashMap<>();
map1.put("publish_time", "desc");
sort.add(map1);

Map<String, String> map2 = new HashMap<>();
map2.put("id", "asc");
sort.add(map2);
但会出现以下错误消息: 第一次尝试:

org.springframework.jdbc.UncategorizedSQLException: 
### Error querying database.  Cause: java.sql.SQLException: sql injection violation, syntax error: syntax error, error in :'rder by
       ? ?', expect QUES, actual QUES pos 381, line 31, column 10, token QUES : 
select * from doc
where 1 = 1
order by
? ? ,
? ?
org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.binding.BindingException: Parameter 'item' not found. Available parameters are [param, paging, sort, param3, param1, param2]
at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:77)
    at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:446)
    at com.sun.proxy.$Proxy96.selectList(Unknown Source)
    at org.mybatis.spring.SqlSessionTemplate.selectList(SqlSessionTemplate.java:230)
    at org.apache.ibatis.binding.MapperMethod.executeForMany(MapperMethod.java:139)
    at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:76)
    at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:59)
第二次尝试:

org.springframework.jdbc.UncategorizedSQLException: 
### Error querying database.  Cause: java.sql.SQLException: sql injection violation, syntax error: syntax error, error in :'rder by
       ? ?', expect QUES, actual QUES pos 381, line 31, column 10, token QUES : 
select * from doc
where 1 = 1
order by
? ? ,
? ?
org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.binding.BindingException: Parameter 'item' not found. Available parameters are [param, paging, sort, param3, param1, param2]
at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:77)
    at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:446)
    at com.sun.proxy.$Proxy96.selectList(Unknown Source)
    at org.mybatis.spring.SqlSessionTemplate.selectList(SqlSessionTemplate.java:230)
    at org.apache.ibatis.binding.MapperMethod.executeForMany(MapperMethod.java:139)
    at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:76)
    at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:59)
  • 这些值必须作为文本输出,因此必须使用
    ${}
    。看
  • 分隔符
    在每个项目之间输出,因此您需要为两个
    都指定
    分隔符=“,”
    ,而不需要
  • 由于
    HashMap
    没有保持条目顺序,因此应该改用
    LinkedHashMap
orderby
${key}${value}

如果您的密钥是从列表中迭代的动态密钥,则可以使用#{dataMap.${key}

org.springframework.jdbc.UncategorizedSQLException: 
### Error querying database.  Cause: java.sql.SQLException: sql injection violation, syntax error: syntax error, error in :'rder by
       ? ?', expect QUES, actual QUES pos 381, line 31, column 10, token QUES : 
select * from doc
where 1 = 1
order by
? ? ,
? ?
org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.binding.BindingException: Parameter 'item' not found. Available parameters are [param, paging, sort, param3, param1, param2]
at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:77)
    at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:446)
    at com.sun.proxy.$Proxy96.selectList(Unknown Source)
    at org.mybatis.spring.SqlSessionTemplate.selectList(SqlSessionTemplate.java:230)
    at org.apache.ibatis.binding.MapperMethod.executeForMany(MapperMethod.java:139)
    at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:76)
    at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:59)