MyBatis中的XML ResultMap与关联

时间:2017-11-22 12:54:41

标签: java associations mybatis dynamicquery xmlmapper

我认为这个问题在Google或堆栈上非常奇怪。让我解释。

我的界面方法中的注释中有结果映射。只有在这种特殊情况下我需要动态查询,这就是我决定在xml文件中为接口编写整个映射器的原因。下面我粘贴整个文件。选择查询应该没问题,但我遇到了<resultMap>的一些困难。

在不同的网站上,我一直在寻找一对一,一对多,多对一的关联和构造这个结果图的良好解释。

我看到有一种可能性将它分成子查询,subresultmaps。但我已经完成了myBatis注释,我想使用它。 你能指点我,应该如何构造resultMap?我不认为需要构造函数,鉴别器,但它仍在大喊......(这就是我添加<collection>标记的原因) - IntelliJ强调整个<resultMap>说:"The content of element type "resultMap" must match "(constructor?,id*,result*,association*,collection*,discriminator?)"

我知道这似乎很明显,但我完全不知道如何正确地做到这一点。请帮帮我。

xml mapper文件:

<?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 namespace="pl.net.manager.dao.UsageCounterDAO">
    <select id="getUsageCounterList" resultType="pl.net.manager.domain.UsageCounter"
            resultMap="getUsageCounterListMap">
        SELECT * FROM usage_counter WHERE
        <if test="apiConsumerIdsList != null">
            api_consumer IN
            <foreach item="item" index="index" collection="apiConsumerIdsList"
                     open="(" separator="," close=")">
                #{item}
            </foreach>
            AND
        </if>
        <if test="serviceConsumerIdsList != null">
            service IN
            <foreach item="item" index="index" collection="serviceConsumerIdsList"
                     open="(" separator="," close=")">
                #{item}
            </foreach>
            AND
        </if>
        <if test="dateFrom != null">
            date &gt;= #{dateFrom} AND
        </if>
        <if test="dateTo != null">
            date &lt;= #{dateTo} AND
        </if>
        <if test="status != null">
            status = #{status}
        </if>
    </select>
    <resultMap id="getUsageCounterListMap" type="">

                    ofType="pl.net.manager.domain.UsageCounter">
            <id property="id" column="id"/>
            <result property="date" column="date"/>
            <result property="apiConsumer" column="api_consumer"
                    javaType="pl.net.manager.domain.ApiConsumer"/>
            <association property="apiConsumer" column="api_consumer"
                         resultMap="pl.net.manager.dao.ApiConsumerDAO.getApiConsumer"/>
            <result property="service" column="service" javaType="pl.net.manager.domain.Service"/>
        <association property="service" column="service"
                     resultMap="pl.net.manager.dao.ServiceDAO.getService"/>

            <result property="counterStatus" column="counter_status"/>
            <result property="ratingProcessId" column="rating_process_id"/>
            <result property="value" column="value"/>
            <result property="createdDate" column="created_date"/>
            <result property="modifiedDate" column="modified_date"/>

    </resultMap>
</mapper>

2 个答案:

答案 0 :(得分:4)

Mapper XML的XSD需要<resultMap>

<association>必须在所有<result>代码之后,这意味着您需要对<result>代码进行分组,然后再添加<association>代码。

其次,您不需要resultType中的resultMapgetUsageCounterList。使用您的resultMap

中的任何一个

第三,WHERE中的getUsageCounterList条款被破坏了。如果只满足第一个条件,那么在这种情况下你的SELECT将是:

SELECT * FROM usage_counter WHERE api_consumer IN (1,2,3) AND 

正如我在上一次对您的查询的回答中提到的,您可以使用<where>标记并按照该答案中提到的语法进行操作。

第四,在resultMap getUsageCounterListMap中,您只需要type,这将是您尝试填充的Java类,因此您可以将ofType移至{{ 1}}。

对于 One-One映射,您可以使用type标记,或者有另一种方法,假设您有一个Java POJO,如下所示:

<association>

您可以使用XML编写映射,如下所示:

public class Country{
    private String name;
    private City capital;
    //getters and setters
}
public class City{
    private String name;
    //getters and setters
}

因此,Mybatis将确保创建<select id="getCountries" resultType="Country"> SELECT c.name, cy.name "capital.name" FROM country c JOIN city cy ON cy.name = c.capital </select> 的实例,并将City中的值分配给该实例的capital.name属性。

对于一对多或多对多映射,您可以浏览MyBatis结果映射的name标记。有关详细信息,请查看提供的链接中的Advacned Result Maps部分。

答案 1 :(得分:1)

这发生在我身上 -

  

元素类型的内容&#34; resultMap&#34;必须匹配   &#34;&#34(构造器,ID *,结果*,关联*,收集*,鉴别器?);

  1. 当有一个或多个拼写错误

  2. 当存在未关闭的头标记或存在不匹配的结束标记时

  3. 当您在<if></if><case><case>

    <的时间映射中在<resultMap>标记内写下collection association种标记时/ LI>
  4. 当你在其他一些标签中写下一些不存在的标签

  5. 希望这些提示可以帮助某人。