S2Daoで配列のインデックスを指定する方法ってある?→ある。
s2daoを使って
配列のインデックスを直接指定できないかな?と思った。
配列を
Select From Table Where column1 In/*dto.arrayStr*/('10000')
のように、IN演算子で使うことが多いけども、
s2daoの/*IF〜END*/
として利用できないかな〜と試してみたら
String[] arrayStr = new String[] { "123", "456" }; dto.setArrayStr(arrayStr );
Select ・・・ From Table Where ・・ /*IF dto.arrayStr[0]=="123"*/ AND (100 = 100) /*END*/ /*IF dto.arrayStr[1]=="456"*/ AND (200 = 200) /*END*/ /*IF dto.arrayStr[2]=="789"*/ AND (300 = 300) /*END*/
とできる。ただし、上のように、配列の中身が2つしかないのに
3つめにアクセスすりゃ、もちろん
java.lang.ArrayIndexOutOfBoundsException
が発生する。
dto.arrayStr()[0] みたいな書き方ではだめ(以下の例外となる)。
org.seasar.framework.exception.OgnlRuntimeException: [ESSR0073]OGNLで例外が発生しました。 理由はognl.MethodFailedException: Method "arrayStr" failed for object XXXXXXXXXXXXXXX [java.lang.NoSuchMethodException: arrayStr()] at org.seasar.framework.util.OgnlUtil.getValue(OgnlUtil.java:48)
そりゃ、そうだ。そんなメソッドないって感じだ。
OGNLを見ると、配列じゃなくてもMAPも使える。
もちろん
http://s2container.seasar.org/2.4/ja/ognl.html
にある
Mapのエントリ
java.util.Mapのエントリもプロパティとして扱うことが出来ます.
この場合,キーがプロパティ名となります.
ただし,プロパティ名として使うことが出来るのは,識別子として有効なjava.lang.String型のキーだけです.
<component name="map"> #{"one" : 1B, "two" : 2B, "three" : 3B} </component> <component name="one"> map.one </component>
に書かれているので、同じように
Map<String,Object> mapSelected = new HashMap<String,Object>(); mapSelected.put("key1","a"); mapSelected.put("key2","b"); mapSelected.put("key3","c");
SELECT ・・・ FROM WHERE /*IF dto.mapSelected.key1="a" */ (1 == 1) /*END*/ /*IF dto.mapSelected.key2="b" */ (1 == 1) /*END*/
みたいな使いかたもできる。
検索する条件をMapにもってたりするようなこともあるとおもうので
いろいろなバリエーションもできそうだ。
/*IF dto.arrayStr[0]=="123"*/ AND (100 = 100) /*END*/
こうゆう風に、配列のインデックスを指定して比較はできるけども
col1 = /*dto.arrayStr[0]*/100
のように、値を出力(置換)するような場合だと、
プロパティ(arrayStr[0])が見つかりませんとなってしまう。
/*dto.mapSelected.key1*/'1000'
というmapを使った場合も、値の出力(置換)できずに、
java.util.Mapにdto.mapSelected.key1のプロパティがありません
となる。
dto内でネストしているのがよくないのか。
値を置換というか、出力することはできないんだろか。s2daoは1.0.48のバージョン.
いろいろ探してて
http://ml.seasar.org/archives/seasar-user/2004-October/001126.html
を見る限りだと
Map map = new HashMap(); map.put("age", "25"); List result = dao.searchByMap(map); public interface HogeDTODao { List searchByMap(Map condition); }
SELECT * FROM hoge WHERE type = 'test' /*IF cond.age != null*/ AND age = /*cond.age*/'20' /*END*/
とあるので、map.age で値を参照しているみたいなんだけどな。