kuniku’s diary

はてなダイアリーから移行(旧 d.hatena.ne.jp/kuniku/)、表示がおかしな箇所はコメントをお願いします。記載されている内容は日付およびバージョンに注意してください。直近1年以上前は古い情報の可能性が高くなります。

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にもってたりするようなこともあるとおもうので
いろいろなバリエーションもできそうだ。


2009-01-29追記

/*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 で値を参照しているみたいなんだけどな。