使用 MyBatis。如何将两个不同的记录映射到一个 table 中,然后在连接 table 时构造一个查询结果?

With MyBatis. How can I map two different records in one table, then construct a single query result when joining that table?

我的查询结果实体的定义有两个字段,origindestination,都是Location类型,我正在尝试获取[=中的信息17=] table 和 JOINS。这是 resultMap 定义和 SQL:

    <resultMap id="queryConditionMap" type="com.offersupport.model.OfferQueryCondition">
        <id column="query_id" property="queryId"/>
        <result column="departure_date" property="departureDate"/>
        <result column="create_time" property="createTime"/>
        <result column="update_time" property="updateTime"/>
        <association property="origin" column="origin_id" javaType="com.offersupport.model.MaerskLocation">
            <id column="location_id" property="locationId"/>
            <result column="city_rkst_code" property="cityRkstCode"/>
            <result column="unloc_code" property="unlocCode"/>
            <result column="city_name" property="cityName"/>
            <result column="country_name" property="countryName"/>
            <result column="region_name" property="regionName"/>
        </association>
        <association property="destination" column="destination_id"
                     javaType="com.offersupport.model.MaerskLocation">
            <id column="location_id" property="locationId"/>
            <result column="city_rkst_code" property="cityRkstCode"/>
            <result column="unloc_code" property="unlocCode"/>
            <result column="city_name" property="cityName"/>
            <result column="country_name" property="countryName"/>
            <result column="region_name" property="regionName"/>
        </association>
    </resultMap>

SQL:

    <select id="getOfferQueryConditionByModel" resultMap="queryConditionMap">
        SELECT
        qc.query_id,
        qc.departure_date,
        qc.create_time,
        l1.location_id,
        l1.city_rkst_code,
        l1.unloc_code,
        l1.city_name,
        l1.country_name,
        l1.region_name,
        l2.location_id,
        l2.city_rkst_code,
        l2.unloc_code,
        l2.city_name,
        l2.country_name,
        l2.region_name
        FROM query_condition mqc
        INNER JOIN location ml1 ON qc.origin_id = l1.location_id
        INNER JOIN location ml2 ON qc.destination_id = l2.location_id
        <where>
            <if test="condition.origin.locationId!=null">
                AND origin_id = #{condition.origin.locationId}
            </if>
            <if test="condition.destination.locationId!=null">
                AND destination_id = #{condition.destination.locationId}
            </if>
            <if test="condition.departureDate!=null">
                AND departure_date = #{condition.departureDate}
            </if>
        </where>
    </select>

本以为origindestination是不同的记录,结果发现origindestination是一样的...

任何人都可以告诉我如何解决它或问题出在哪里吗?

我正在使用 MyBatis 3.2.2 和 MS SQL Server 2008 R2。

当结果列表包含具有相同名称的列时,您将需要为至少一列提供别名。例如:

<resultMap id="queryConditionMap" type="com.offersupport.model.OfferQueryCondition">
  <id column="query_id" property="queryId"/>
  <result column="departure_date" property="departureDate"/>
  <result column="create_time" property="createTime"/>
  <result column="update_time" property="updateTime"/>
  <association property="origin" column="origin_id" javaType="com.offersupport.model.MaerskLocation">
    <id column="l1_location_id" property="locationId"/>
    <result column="l1_city_rkst_code" property="cityRkstCode"/>
    <result column="l1_unloc_code" property="unlocCode"/>
    <result column="l1_city_name" property="cityName"/>
    <result column="l1_country_name" property="countryName"/>
    <result column="l1_region_name" property="regionName"/>
  </association>
  <association property="destination" column="destination_id" javaType="com.offersupport.model.MaerskLocation">
    <id column="location_id" property="locationId"/>
    <result column="city_rkst_code" property="cityRkstCode"/>
    <result column="unloc_code" property="unlocCode"/>
    <result column="city_name" property="cityName"/>
    <result column="country_name" property="countryName"/>
    <result column="region_name" property="regionName"/>
  </association>
</resultMap>

SQL:

<select id="getOfferQueryConditionByModel" resultMap="queryConditionMap">
  SELECT
    qc.query_id,
    qc.departure_date,
    qc.create_time,
    l1.location_id as l1_location_id,
    l1.city_rkst_code as l1_city_rkst_code,
    l1.unloc_code as l1_unloc_code,
    l1.city_name as l1_city_name,
    l1.country_name as l1_country_name,
    l1.region_name as l1_region_name,
    l2.location_id,
    l2.city_rkst_code,
    l2.unloc_code,
    l2.city_name,
    l2.country_name,
    l2.region_name
  FROM query_condition mqc
  INNER JOIN location ml1 ON qc.origin_id = l1.location_id
  INNER JOIN location ml2 ON qc.destination_id = l2.location_id
  <where>
    <if test="condition.origin.locationId!=null">
      AND origin_id = #{condition.origin.locationId}
    </if>
    <if test="condition.destination.locationId!=null">
      AND destination_id = #{condition.destination.locationId}
    </if>
    <if test="condition.departureDate!=null">
      AND departure_date = #{condition.departureDate}
    </if>
  </where>
</select>