开发者社区> 问答> 正文

SQLUtils - format error

使用mybatis按照如下方式:

order by #{sort} #{order}

会有以下错误

[WARN ] [2018-11-19 14:51:45.687] com.alibaba.druid.sql.SQLUtils - format error com.alibaba.druid.sql.parser.ParserException: syntax error, error in :'rder by ? ?

', expect QUES, actual QUES pos 286, line 13, column 26, token QUES

请问SQLUtils是不是不支持这种连续参数的写法?

原提问者GitHub用户meidea

展开
收起
山海行 2023-07-05 19:47:54 194 0
2 条回答
写回答
取消 提交回答
  • 北京阿里云ACE会长

    的,SQLUtils 不支持这种连续参数的写法。在 MyBatis 中,使用 #{sort} 和 #{order} 表示两个不同的参数,但它们之间不能有空格。如果您需要按照指定的排序方式进行查询,可以使用以下两种方法:
    方法 1:使用独立的标签


    select * from table_name
    where #{sort} = 'asc' or #{sort} = 'desc'
    and #{order} = 'id' or #{order} = 'name'

    CopyCopyCopy

    在 Mapper.xml 中使用独立的标签:






    CopyCopyCopy

    方法 2:使用嵌套的标签


    select * from table_name
    where #{sort} = 'asc' or #{sort} = 'desc'
    and ( #{order} = 'id' or #{order} = 'name' )

    CopyCopyCopy

    在 Mapper.xml 中使用嵌套的标签:






    CopyCopyCopy

    这两种方法都可以解决您的问题,您可以根据实际情况选择合适的方法。

    2023-07-30 15:15:24
    赞同 展开评论 打赏
  • 这样似乎没问题。

    public static void main(String[] args) {

    String sql2 = "(SELECT id\n" +
            "        FROM test_person\n" +
            "        WHERE id >= (SELECT MAX(id) FROM test_person2))\n" +
            "        UNION ALL\n" +
            "        SELECT id\n" +
            "        FROM time_test order by ? ?;";
    
    System.out.println(SQLUtils.format(sql2, "mysql"));
    

    }

    输出:

    (SELECT id FROM test_person WHERE id >= (SELECT MAX(id) FROM test_person2)) UNION ALL SELECT id FROM time_test order by ? ?;

    原回答者GitHub用户ddzhj

    2023-07-06 11:06:40
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载