Если вы используете MyBatis
, у вас есть два варианта, описанные в справочной документации а>:
- Вложенный выбор: путем выполнения другого сопоставленного оператора SQL, который возвращает требуемый сложный тип.
- Вложенные результаты: использование сопоставлений вложенных результатов для работы с повторяющимися подмножествами объединенных результатов.
В вашем случае, поскольку вы хотите загрузить множество ассоциаций, вы должны использовать Вложенный выбор, потому что вы не можете загрузить множество ассоциаций с помощью fetch outer join
(только ассоциации с одной выбранной строкой)
Вложенный выбор
В этой опции вам нужно добавить ссылку на выбор, который загружает дайю по отношению внешнего ключа (в вашем случае внешний ключ человека), отношения, которое в вашем случае dogs
в `ResultMap.
Итак, у вас должен быть запрос, загружающий таблицу Person
:
<select id="findById" resultMap="personResult">
SELECT * FROM PERSON WHERE NAME = #{name}
</select>
Его метод:
Person findById(String name);
Затем запрос, который загружает собак по ключевым отношениям человека:
<select id="findDogsByPerson" resultType="Dog">
SELECT * FROM DOG WHERE ID_PERSON = #{namePerson}
</select>
И его метод:
List<Dog> findDogsByPerson(String namePerson);
Затем вы должны добавить выбор как ассоциацию в карту результатов, ссылающуюся на выбор по внешнему ключу (findDogsByPerson
). В вашем случае много ассоциаций, поэтому вы должны использовать тег collection
вместо association
.
<resultMap id="personResult" type="Person">
<!--Other properties maps -->
<!-- ..... -->
<collection property="dogs" column="id_person" javaType="Dog" select="selectDogByPerson"/>
<!-- ..... -->
</resultMap>
Альтернатива аннотации
Если хотите, можете использовать annotations
для этого. Это почти то же самое, но ResultMap
и Select
идут выше методов. Это будет использовать аннотацию @Many
, ссылающуюся на многие отношения.
@Select("SELECT * FROM PERSON WHERE NAME = #{name}")
@Results(value = {
@Result(property="name", column="name"),
@Result(property="surname", column="surname"),
@Result(property="dogs", javaType=List.class, column="name",
many=@Many(select="findDogsByPerson"))})
Person findById(String name);
@Select("SELECT * FROM DOG WHERE ID_PERSON = #{namePerson}")
@Results(value = {
@Result(property="name", column="name"),
@Result(property="dogId", column="dogId")})
List<Dog> findDogsByPerson(String namePerson);
person
Pau
schedule
24.11.2016