web-dev-qa-db-ja.com

myBatis select result(list)をオブジェクトのプロパティに設定するにはどうすればよいですか?

通常、myBatisのselectメソッドは、単一のオブジェクトまたは汎用のリストタイプを返します。たとえば、クラスのすべての生徒を取得したいとします。

<select id="fetchStudentsOfClass" parameterType="int" resultMap="resultMapStudent">
    SELECT * FROM students WHERE class_id=#{id}
</select>

List<Student>のような結果を簡単に得ることができます。

さて、List<Student>ではなく次のような結果を取得したい場合:

class MyClass
{
    List<Student> getStudents{return this.students;}
    void setStudents(List<Student> students){this.students = students}
    private List<Student> students;
}

どのようにできるのか?

7
guogangj

これが<collection />要素の目的です。 MyBatisが複数の行を1つのオブジェクトに折りたたむ方法を理解できるように、コンテナと値の両方に<id />を適切にマークすることが重要です。

<resultMap id="resultMapClass" type="some.package.MyClass" autoMapping="true">
    <id property="classId" column="class_id" javaType="integer"/>
    <collection property="students" ofType="some.package.Student" autoMapping="true">
        <id property="studentId" column="student_id" javaType="integer"/>
    </collection>
</resultMap>
<select id="fetchStudentsOfClass" parameterType="int" resultMap="resultMapClass">
    SELECT *
    FROM students
    WHERE class_id = #{id}
</select>

詳細については、 http://mybatis.github.io/mybatis-3/sqlmap-xml.html#Result_Maps を参照してください。

7
nivekastoreth