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の結果の行数なので意味が無く、事実上使えなくなってしまう