2012-07-25 28 views
2

我想在Spring MVC應用程序中使用NamedParameterJdbTemplate。問題是,當我包含下面列出的ORDER BY子句時,綁定參數似乎不起作用(不進行排序)。但是,在sql中按列名的硬編碼順序工作。ORDER BY在NamedParameterJDBCTemplate中的綁定參數

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()); 

回答

6

值只可以綁定作爲參數。不是查詢本身的一部分。

最後,生成預準備語句並將參數綁定到預準備語句。準備好的語句的原則是準備查詢的執行計劃(其中按順序的子句是其中的一部分),並且使用不同的參數一次或幾次執行查詢。

如果查詢未完成,則無法準備和重用執行計劃。因此,對於查詢的這一部分,您需要使用字符串連接動態生成查詢,而不是參數。

+0

感謝澄清。我完全監督我試圖綁定部分查詢。再次感謝。 – aprajitha 2012-07-26 06:19:10