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

パラメータとしてバインドできるのは値のみです。クエリ自体の一部ではありません。

最後に、準備済みステートメントが生成され、パラメーターが準備済みステートメントにバインドされます。プリペアド ステートメントの原則は、(order by 句がその一部である) クエリの実行プランを準備し、その後、さまざまなパラメーターを使用してクエリを 1 回または数回実行することです。

クエリが完了していない場合、実行プランを準備して再利用することはできません。したがって、クエリのこの部分では、パラメーターではなく、文字列連結を使用してクエリを動的に生成する必要があります。

于 2012-07-25T21:41:17.350 に答える