【问题标题】:Order by clause query in Spring MVC with MapSqlParameterSource使用 MapSqlParameterSource 在 Spring MVC 中按子句查询排序
【发布时间】:2019-01-02 03:46:11
【问题描述】:

我正在尝试在 Spring MVC 4 中使用 order by 子句进行 SQL 查询。但它不起作用。我正在使用 MapSQLParameterSource 类来定义 sql 参数。

    MapSqlParameterSource params = new MapSqlParameterSource();
    params.addValue("lowerLimit", lowerLimit);
    params.addValue("upperLimit", upperLimit);
    params.addValue("filter", filter.trim()+"%");
    params.addValue("order", order);
    String sql = "SELECT * FROM tbl_Subject WHERE subjectName LIKE :filter ORDER BY :order limit :lowerLimit, :upperLimit";

它实际上不起作用。不排序任何列。当我尝试硬编码时,它可以作为方面正常工作。

String sql = "SELECT * FROM tbl_Subject WHERE subjectName LIKE :filter ORDER BY subjectId DESC limit :lowerLimit, :upperLimit";

如何使用 MapSqlParameterSource 按子句查询排序。

【问题讨论】:

  • ` String sql = "SELECT * FROM tbl_Subject WHERE subjectName LIKE :filter ORDER BY "+order+" limit :lowerLimit, :upperLimit";` 用这个代替addValue
  • 这种方式以后不会造成SQL注入吗?因为我允许将其直接放在我的查询中?
  • 在添加到 sql 变量之前删除不需要的字符。

标签: java sql spring spring-mvc spring-data-jpa


【解决方案1】:

问题出在这一行:

params.addValue("order", order);//consider this return col_name

这将被翻译成:

.. ORDER BY 'col_name' limit ..
            ^        ^

这是一个错误的语法,逻辑上在ORDER BY 之后你必须传递一个列名并且不是一个值

.. ORDER BY col_name limit ..
            ^^^^^^^^

相反,您必须直接将其传递给查询,但要传递正确的名称,如果您传递错误的输入,这可能会导致语法错误或 SQL 注入

【讨论】:

  • 同意,不久前遇到过类似问题
猜你喜欢
  • 2021-11-05
  • 2018-07-22
  • 1970-01-01
  • 1970-01-01
  • 2013-07-05
  • 1970-01-01
  • 2017-04-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多