MyBatis @Select, ссылающийся на select, определенный в файле mapper XML - PullRequest
2 голосов
/ 25 марта 2012

У меня есть выбор, определенный в файле mapper.xml:

<mapper namespace="foo">

  <select id="selectWithRoles" parameterType="String" resultMap="personWithRoles">
    select * 
    from 
    PERSON P
    left outer join PERSON_ROLE R on P.ID = R.PERSON_ID
    where P.ID = #{id}
  </select>  

  <resultMap id="personWithRoles" type="Person">
    <id property="id" column="ID" />
    <collection property="roles" ofType="Role">
      <id property="personId" column="PERSON_ID"/>
      <result property="name" column="NAME"/>
    </collection>
  </resultMap>

</mapper>

, и я хочу представить этот выбор через интерфейс DAO с помощью аннотаций без копирования операторов выбора в DAO.Следующее прекрасно работает:

@Select("select * from PERSON P left outer join PERSON_ROLE R on P.ID = R.PERSON_ID where P.ID = #{id}")
@ResultMap("personWithRoles")
public Person loadByIdWithRoles(String id);

Но я не люблю копировать SQL в аннотации (может быть довольно длинным), хочу что-то вроде этого:

@Select("selectWithRoles")
public Person loadByIdWithRoles(String id);

, где "selectWithRoles" - это идентификаторвыберите определенный в XML.Возможно ли это?

1 Ответ

2 голосов
/ 27 марта 2012

Нашел ответ.В случае, если кому-то это понадобится: очевидно, если пространство имен в файле XML совпадает с полностью квалифицированным именем интерфейса И имя метода совпадает с идентификатором в XML, то MyBatis волшебным образом заставит его работать без аннотаций.

<mapper namespace="foo">

  <select id="selectWithRoles" parameterType="String" resultMap="personWithRoles">
    select * 
    from 
    PERSON P
    left outer join PERSON_ROLE R on P.ID = R.PERSON_ID
    where P.ID = #{id}
  </select>  

  <resultMap id="personWithRoles" type="Person">
    <id property="id" column="ID" />
    <collection property="roles" ofType="Role">
      <id property="personId" column="PERSON_ID"/>
      <result property="name" column="NAME"/>
    </collection>
  </resultMap>

</mapper>

Обратите внимание, что имя пакета соответствует пространству имен в XML, а имя метода соответствует идентификатору выбора:

package foo;
public Person public Person selectWithRoles(String id);
...