開発プロジェクトの方針に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(); }