MyBatis3 シングルクオート内のパラメータを置き換えるには?

先に結論から

ST_GeomFromText('POINT(${longitude} ${latitude})')

上記は位置情報をMySQL8のカラムに挿入するSQLの一部分ですが、調べた限り$パラメータを利用して置き換えてやる必要がありそうです。(#パラメータだとエラーで実行できず)

ことの発端

Solrの位置情報検索を利用してなにか作れないかなと相変わらず試行錯誤しています。
(Solrの元データとなる)MySQLに位置データを挿入する際、以下のようなSQLでデータを投入するようです(独自調査による)

    ST_GeomFromText('POINT(${longitude} ${latitude})')

ST_GeomFromText関数に文字列でPOINTを渡すというのが、なんだか違和感アリアリですが、こうやって値を渡すようです。
それでPOINT部分をシングルクオートで囲って文字列をして関数に渡すわけですが、文字列内のパラメータ置き換えがうまく行かず、しばらくハマっていました。

以下が失敗例

ST_GeomFromText('POINT(#{longitude} #{latitude})')

と#パラメータを利用したところうまく行かずSQL実行時に以下のようなエラーが発生しました

java.sql.SQLException: Parameter index out of range (5 > number of parameters, which is 4).

#の代わりに$を使用することでSQLを実行することができました。

#と$の違いについて

#パラメータ:PrepairedStatementの?に相当
$パラメータ:パラメータをそのまま出力
参考:
https://mybatis.org/mybatis-3/ja/sqlmap-xml.html

通常は#でパラメータを置き換えることが多いと思います。
$はテーブル名の置き換えなど、特別な場合に利用することが多いです。

$は入力値をそのまま出力するため、SQLインジェクションを引き起こす可能性があるため、取り扱いに注意して使用する必要があります。(ユーザーが入力した値を表示するときには使用しない など)

以上

ということで、MyBatisを使用して、シングルクォート内のパラメータを置き換えるときは$パラメータを使用する。というお話でした。
ただ、$パラメータは記載したとおりSQLインジェクションを引き起こす可能性があるので、どうにもイマイチな感じが否めません。
このあたりはもう少し調査してみる予定です。