動的な条件
iBatisで動的な条件を作成してみる。
例えばidのリストもしくは名前のリストで一致するものの一覧を取得する場合
<select id="getFilter" resultMap="result" parameterClass="tutorial.UserFilter"> SELECT id,name,password,salary FROM suser <dynamic prepend="WHERE"> <iterate prepend="OR " property="ids" open="id in (" close=")" conjunction=","> #ids[]# </iterate> <iterate prepend="OR " property="names" open="name in (" close=")" conjunction=","> #names[]# </iterate> </dynamic> ORDER by id </select>
で、parameter指定用として
tutorial.UserFilter.java
public class UserFilter { int ids[] = new int[0]; String names[] = new String[0]; public int[] getIds() { return ids; } public void setIds(int[] ids) { this.ids = ids; } public String[] getNames() { return names; } public void setNames(String[] names) { this.names = names; } }
のようなクラスを用意し、
public List<User> listfilter( UserFilter filter, Pager page ) throws DataAccessException { List<User> queryForList = (List<User>)this.getSqlMapClientTemplate().queryForList( "getFilter", filter, page.getSkip(), page.getMax() ); return queryForList; }
のように渡してあげる。
ちょっとTIPS:prependは"OR"ではなく "OR "のようにスペースをつける。そうでないとopenの文字と繋がってしまう。
openの文字列の前にスペースをつけてもいい。