XML MyBatis 中的 ResultMap 与关联
XML ResultMap in MyBatis with association
我在 google 或堆栈上看到这个问题的描述非常奇怪。让我解释。
我在接口方法的注释中有结果映射。只有在这种特殊情况下我才需要动态查询,这就是我决定在 xml 文件中为接口编写整个映射器的原因。下面我粘贴整个文件。 select 查询应该没问题,但我在使用 <resultMap>
时遇到了一些困难。
在不同的网站上,我一直在寻找对一对一、一对多、多对一关联和此结果图的构造的一般解释。
我看到有某种可能性可以将其分成子查询、子结果映射。但是我已经用 myBatis 注释完成了,我想使用它。
你能指导我,resultMap应该如何构造?我不认为需要构造函数、鉴别器,但它仍在大喊大叫……(这就是我添加 <collection>
标记的原因)- IntelliJ 强调了整个 <resultMap>
说法:"The content of element type "resultMap" must match "(constructor?,id*,result*,association*,collection*,discriminator?)"
我知道这似乎很明显,但我完全不知道如何正确地做到这一点。请帮助我。
xml 映射器文件:
<?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 >= #{dateFrom} AND
</if>
<if test="dateTo != null">
date <= #{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>
Mapper XML 的 XSD 期望在 <resultMap>
中:
<association>
必须在所有 <result>
标签之后,这意味着您需要将 <result>
标签分组,然后在其后添加 <association>
标签。
其次,您不需要 getUsageCounterList
中的 resultType
和 resultMap
。使用您的情况下的任何一个 resultMap
第三,您在 getUsageCounterList
中的 WHERE
子句已损坏。如果仅满足第一个条件怎么办,那么在这种情况下,您的 SELECT 将类似于:
SELECT * FROM usage_counter WHERE api_consumer IN (1,2,3) AND
因此,正如我在之前对您的查询的回答中提到的,您可以使用 <where>
标签并遵循该回答中提到的语法。
第四,在 resultMap
getUsageCounterListMap
中,您只需要 type
,这将是您要填充的 Java class,因此您可以将 ofType
移动到 type
.
对于一对一映射,你可以只使用一个<association>
标签,或者有另一种方法,假设你有一个Java POJOs下面:
public class Country{
private String name;
private City capital;
//getters and setters
}
public class City{
private String name;
//getters and setters
}
可以在XML中写一个Mapping,如下图:
<select id="getCountries" resultType="Country">
SELECT c.name, cy.name "capital.name"
FROM country c
JOIN city cy ON cy.name = c.capital
</select>
所以Mybatis会确保创建一个City
的实例并将capital.name
中的值赋值给那个实例的name
属性.
对于一对多或多对多映射你可以探索MyBatis结果映射的<collection>
标签。有关详细信息,请查看所提供的 link 中的 Advacned Result Maps 部分。
这发生在我身上 -
The content of element type "resultMap" must match
"(constructor?,id*,result*,association*,collection*,discriminator?)".
出现一处或多处错别字时
当有未闭合的头标签或存在不匹配的结束标签时
当您在映射 collection
或 association
时在 <resultMap>
标签内写入 <if></if>
<case><case>
类型的标签
当你写了一些不应该存在于其他标签中的标签时
希望这些提示可以对某人有所帮助。
我在 google 或堆栈上看到这个问题的描述非常奇怪。让我解释。
我在接口方法的注释中有结果映射。只有在这种特殊情况下我才需要动态查询,这就是我决定在 xml 文件中为接口编写整个映射器的原因。下面我粘贴整个文件。 select 查询应该没问题,但我在使用 <resultMap>
时遇到了一些困难。
在不同的网站上,我一直在寻找对一对一、一对多、多对一关联和此结果图的构造的一般解释。
我看到有某种可能性可以将其分成子查询、子结果映射。但是我已经用 myBatis 注释完成了,我想使用它。
你能指导我,resultMap应该如何构造?我不认为需要构造函数、鉴别器,但它仍在大喊大叫……(这就是我添加 <collection>
标记的原因)- IntelliJ 强调了整个 <resultMap>
说法:"The content of element type "resultMap" must match "(constructor?,id*,result*,association*,collection*,discriminator?)"
我知道这似乎很明显,但我完全不知道如何正确地做到这一点。请帮助我。
xml 映射器文件:
<?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 >= #{dateFrom} AND
</if>
<if test="dateTo != null">
date <= #{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>
Mapper XML 的 XSD 期望在 <resultMap>
中:
<association>
必须在所有 <result>
标签之后,这意味着您需要将 <result>
标签分组,然后在其后添加 <association>
标签。
其次,您不需要 getUsageCounterList
中的 resultType
和 resultMap
。使用您的情况下的任何一个 resultMap
第三,您在 getUsageCounterList
中的 WHERE
子句已损坏。如果仅满足第一个条件怎么办,那么在这种情况下,您的 SELECT 将类似于:
SELECT * FROM usage_counter WHERE api_consumer IN (1,2,3) AND
因此,正如我在之前对您的查询的回答中提到的,您可以使用 <where>
标签并遵循该回答中提到的语法。
第四,在 resultMap
getUsageCounterListMap
中,您只需要 type
,这将是您要填充的 Java class,因此您可以将 ofType
移动到 type
.
对于一对一映射,你可以只使用一个<association>
标签,或者有另一种方法,假设你有一个Java POJOs下面:
public class Country{
private String name;
private City capital;
//getters and setters
}
public class City{
private String name;
//getters and setters
}
可以在XML中写一个Mapping,如下图:
<select id="getCountries" resultType="Country">
SELECT c.name, cy.name "capital.name"
FROM country c
JOIN city cy ON cy.name = c.capital
</select>
所以Mybatis会确保创建一个City
的实例并将capital.name
中的值赋值给那个实例的name
属性.
对于一对多或多对多映射你可以探索MyBatis结果映射的<collection>
标签。有关详细信息,请查看所提供的 link 中的 Advacned Result Maps 部分。
这发生在我身上 -
The content of element type "resultMap" must match "(constructor?,id*,result*,association*,collection*,discriminator?)".
出现一处或多处错别字时
当有未闭合的头标签或存在不匹配的结束标签时
当您在映射
collection
或association
时在<resultMap>
标签内写入<if></if>
<case><case>
类型的标签当你写了一些不应该存在于其他标签中的标签时
希望这些提示可以对某人有所帮助。