在NamedParameterJDBCTemplate中绑定ORDER BY的参数。

问题描述 投票:3回答:2

我正试图在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());
spring jdbctemplate
2个回答
9
投票

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

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

如果查询不完整,执行计划就不能编制,不能重复使用。所以,对于查询这部分,需要使用字符串连词动态生成查询,而不是参数。


1
投票

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

" order by "+ sortBy + " " + sortOrder;
© www.soinside.com 2019 - 2024. All rights reserved.