mybatis で固定値をSQL Mapで指定するにはOGNL式を使う

開発プロジェクトの方針にSQL文に固定値を記述するのを絶対に禁止とか
融通の効かない、賛同できないことが時々ある。
プロジェクトによってそういうのもあって苦労するのだが、mybatis には OGNL書式が使える
OGNL(Object Graph Navigation Language) のことである。

例)

<select id="getItems" resultType="org.sample.dto.Gstore">
SELECT g.* FROM group_stores g 
LEFT JOIN (SELECT id FROM items
 WHERE view_code IN ( '10201', '10202' ) )  i 
ON g.code = i.id
</select>

このSQLMapでの view_code IN ( '10201', '10202' ) をパラメータで与えるのではなく、
動的が無理でも任意の定数に参照させるのに、OGNL書式を使う

定数として以下を定義

package org.sample;

public interface Access{
   public static final String WHITE = "10201";
   public static final String BLUE  = "10202";
}

${ } で、OGNL式を記載する。

<select id="getItems" resultType="org.sample.dto.Gstore">
SELECT g.* FROM group_stores g 
LEFT JOIN (SELECT id FROM items
 WHERE view_code IN ( '${@org.sample.Access@WHITE}', '${@org.sample.Access@BLUE}' ) ) i
ON g.code = i.id
</select>

#{ } の記述では想定どおりに動かない
view_code IN ( #{@org.sample.Access@WHITE} , #{@org.sample.Access@BLUE} )
と書いて良さそうなものだけど、これはダメだ

enum による定数定義を使いたい場合、

package org.sample;

public enum Color{
    WHITE("10201"), BLUE("10202"), RED("10203");

    private String value;
    private Color(int value) {
        this.value = value;
    }
    public int getValue() {
        return value;
    }
}

WHERE句も、以下のように書ける

 WHERE view_code IN ( '${@org.sample.Color@WHITE.getValue()}', '${@org.sample.Color@BLUE.getValue()}' )


Javaコードの中での OGNL式の取り扱い

try{
   Object obj = Ognl.getValue(Ognl.parseExpression("@org.sample.Access@WHITE"), Access.class);
 
   System.out.println(obj.toString());
}catch(OgnlException e){
    e.printStackTrace();
}