iBatisから1対多のテーブルからのデータ取得2

前の方法(iBatisでの1対多のテーブルからのデータ取得 - Struts 2+Spring 2+Tiles+Acegi+iBatis+GWT+JUnit 4+JMockit でフルスタックJAVAフレームワーク)だと、1対多の多側の取得にN回のクエリ実行が必要で、全体でN+1回のクエリを実行することになってしまう。
それだと効率がよくない場合があるので、それを1回のクエリで済ませてしまう方法の1つが iBatisのgroupBy指定 によるものである。

これは、多側のテーブルもJOINしたクエリを発行し、結果をgroupByで指定した所定の列の値によりグルーピングするものである。

<sqlMap namespace="suser">
  <resultMap id="hist" class="tutorial.User$History">
    <result property="date" 	column="date"/>
    <result property="pay" 		column="pay"/>
  </resultMap>
  <resultMap id="getjoin" class="tutorial.User" groupBy="id" >
    <result property="id" 		column="id"    	  />
    <result property="name" 	column="name" 	  />
    <result property="password" column="password" />
    <result property="salary"   column="salary"	  />
    <result property="history"  resultMap="suser.hist"/>
  </resultMap>

  <select id="getAll2" resultMap="getjoin">
	SELECT a.id, a.name, a.password, a.salary, b.date, b.pay
	  FROM suser as a left OUTER JOIN history as b ON ( a.id=b.id )
  	 ORDER by a.id
  </select>
</sqlMap>

これで、Userのhistoryに tutorial.User.History のリストが取得された、Userの一覧がとれる。

ちょっとTIPS:この方法の場合は、queryForListのskipとかmaxの指定はqueryの結果の行数なので意味が無く、事実上使えなくなってしまう