MyBatis - Как объединить несколько столбцов из одной таблицы - PullRequest
1 голос
/ 27 июня 2019

Я пытаюсь узнать, как объединить несколько столбцов из одной таблицы в один столбец из другой таблицы для заданного идентификатора.

Вот мой командный стол:

create table teams ( 
  id varchar(10),
  name varchar(30),
  primary key (id)
);

Вот мой стол командного матча:

create table teammatch (
  id integer,
  firstTeamId varchar,
  secondTeamId varchar,
  matchId integer,
  primary key(id),
  foreign key (firstTeamId) references teams (id),
  foreign key (secondTeamId) references teams (id)
);

Мой sql:

select teammatch.*, t1.*, t2.*
    from teammatch
    inner join teams t1 on teammatch.firstTeamId = t1.id
    inner join teams t2 on teammatch.secondTeamId = t2.id
    where teammatch.id = #{id}

Данные:

ID      FIRSTTEAMID     SECONDTEAMID 
1       POR             DEN 
2       TOR             PHI 

Этот запрос возвращает команду POR для t1 и t2, но мне нужно, чтобы вернуть POR для t1 и DEN для t2

EDIT: Это прекрасно работает, когда я пишу SQL-запрос в базе данных H2, но когда я пишу его с mybatis в файле картографического XML-файла, он возвращает одинаковое значение для обоих полей.

Вот моя карта результатов

<resultMap id="TeamMatchMap" type="TeamMatch">
    <id column="id" property="id" />

    <association property="firstTeamId" column="firstTeamId" javaType="Team">
      <id column="id" property="id" />
      <result column="name" property="name" />
    </association>

    <association property="secondTeamId" column="secondTeamId" javaType="Team">
      <id column="id" property="id" />
      <result column="name" property="name" />
    </association>
  </resultMap>

1 Ответ

1 голос
/ 27 июня 2019

пожалуйста, попробуйте поменять свой маппер на что-то вроде этого

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper>
    <select id="getTeammatches"
            resultMap="teamMatchMap">
        select
            teammatch.id as matchid       ,
            t1.id        as firstteam_id  ,
            t1.name      as firstteam_name,
            t2.id        as secondteam_id ,
            t2.name      as secondteam_name
          from teammatch
            inner join teams t1 on teammatch.firstTeamId = t1.id
            inner join teams t2 on teammatch.secondTeamId = t2.id
          where teammatch.id = #{id}
    </select>
    <resultMap type="TeamMatch" id="teamMatchMap">
        <result property="id" column="MATCHID"/>
        <association property="team1" columnPrefix="FIRSTTEAM_" resultMap="teamMap"/>
        <association property="team2" columnPrefix="SECONDTEAM_" resultMap="teamMap"/>
    </resultMap>
    <resultMap type="Team" id="teamMap">
        <result property="id" column="ID"/>
        <result property="name" column="NAME"/>
    </resultMap>
</mapper>

, объявляя отдельный resultMap для Team или ссылаясь на существующие, вам не нужно отображать столбцы дважды в теге body association -tag

вы использовали column -атрибут для association - насколько я знаю, он используется, только если вы хотите, чтобы myBatis выполнял anoter select -tag

Редактировать

Я написал картограф прежде, чем прочитал ваше редактирование и комментарий

если ваш класс Team предоставляет конструктор, который принимает идентификатор и имя, ваш teamMap также может выглядеть следующим образом

    <resultMap type="Team" id="teamMap">
        <constructor>
            <idArg column="ID"/>
            <arg column="NAME"/>
        </constructor>
    </resultMap>
...