8

我正在尝试在 Spring MVC 应用程序中使用 NamedParameterJdbTemplate。问题是当我包含下面列出的 ORDER BY 子句之一时,绑定参数似乎不起作用(没有排序发生)。但是,在 sql 中按列名的硬编码顺序有效。

ORDER BY column1 
ORDER BY column1 
ORDER BY column1 asc
ORDER BY column1 desc

例如,下面列出的查询不起作用。

    private static final String SEARCH_ALL_BY_SORT_ORDER=
        " select FIRST_NM, MIDDLE_NM, LAST_NM, CUSTOMER_IDENTIFIER,  EMAIL_ADDRESS,  ACCOUNT_ID" +
        " from VIEW " +
        " where CUSTOMER_IDENTIFIER= :customerIdentifier " +
        " and ( REGEXP_LIKE(FIRST_NM, :firstName, 'i') " +
        "       or REGEXP_LIKE(LAST_NM, :lastName, 'i')  " +
        "       or REGEXP_LIKE(EMAIL_ADDRESS, :emailAddress, 'i')  )" +
        " order by :sortColumns";

具有按列硬编码顺序的相同查询有效:

    private static final String SEARCH_ALL_BY_SORT_ORDER=
        " select FIRST_NM, MIDDLE_NM, LAST_NM, CUSTOMER_IDENTIFIER,  EMAIL_ADDRESS,  ACCOUNT_ID" +
        " from VIEW " +
        " where CUSTOMER_IDENTIFIER= :customerIdentifier " +
        " and ( REGEXP_LIKE(FIRST_NM, :firstName, 'i') " +
        "       or REGEXP_LIKE(LAST_NM, :lastName, 'i')  " +
        "       or REGEXP_LIKE(EMAIL_ADDRESS, :emailAddress, 'i')  )" +
        " order by LAST_NM";

这是相关的jdbctemplate代码

Map <String, Object> params = new HashMap <String, Object>();
        params.put("customerIdentifier", customerIdentifier);
        params.put("firstName",  searchCriteria );
        params.put("lastName", searchCriteria );
        params.put("emailAddress",searchCriteria);
           // sortBy is COLUMN name
           // sortOrder is either 'asc' or 'desc'
        params.put("sortColumns", sortBy + " " + sortOrder);
           // Using just the column name does not work either
           //params.put("sortColumns", sortBy);

        namedParameterJdbcTemplate.query(SEARCH_ALL_BY_SORT_ORDER, params, new MemberMapper());
4

2 回答 2

14

只有值可以绑定为参数。不是查询本身的一部分。

最后生成一个prepared statement,并将参数绑定到prepared statement。Prepared statement的原理是准备查询的执行计划(order by子句是其中的一部分),然后执行一次或多次查询,参数不同。

如果查询不完整,则无法准备和重用执行计划。因此,对于查询的这一部分,您需要使用字符串连接而不是参数动态生成查询。

于 2012-07-25T21:41:17.350 回答
1

正如 JB Nizet 已经解释的那样,部分查询不能用作绑定键(orderby :age)。因此,我们需要在这里使用串联。

" order by "+ sortBy + " " + sortOrder;
于 2020-06-11T16:31:53.667 回答