我正在尝试在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());
答案 0 :(得分:8)
只能将值绑定为参数。不是查询本身的一部分。
最后,生成预准备语句,并将参数绑定到预准备语句。准备好的语句的原则是准备查询的执行计划(order by子句是其中的一部分),并且在具有不同参数之后执行一次或多次查询。
如果查询未完成,则无法准备和重复使用执行计划。因此,对于此部分查询,您需要使用字符串连接动态生成查询,而不是参数。
答案 1 :(得分:1)
正如JB Nizet已经解释的那样,查询的某些部分不能用作绑定键(orderby:age)。因此,我们将需要在此处使用串联。
" order by "+ sortBy + " " + sortOrder;