[英]XML ResultMap in MyBatis with association
我觉得这个问题在google或stack上非常奇怪。 让我解释。
我的界面方法中的注释中有结果映射。 只有在这种特殊情况下我需要动态查询,这就是我决定在xml文件中为接口编写整个映射器的原因。 下面我粘贴整个文件。 选择查询应该没问题,但我在<resultMap>
遇到了一些困难。
在不同的网站上,我一直在寻找一对一,一对多,多对一的关联和构造这个结果图的良好解释。
我看到有一种可能性将它分成子查询,subresultmaps。 但我已经完成了myBatis注释,我想使用它。 你能指点我,应该如何构造resultMap? 我不认为需要构造函数,鉴别器,但它仍然在喊......(这就是我添加<collection>
mark的原因) - 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类,因此您可以将ofType
移动到type
。
对于One-One映射 ,您可以使用<association>
标记,或者有另一种方法,假设您有一个Java POJO,如下所示:
public class Country{
private String name;
private City capital;
//getters and setters
}
public class City{
private String name;
//getters and setters
}
您可以使用XML编写映射,如下所示:
<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>
标记。 有关更多信息,请查看提供的链接中的Advacned Result Maps部分。
这发生在我身上 -
元素类型“resultMap”的内容必须匹配“(构造函数?,id *,结果*,关联*,集合*,鉴别器?)”。
当有一个或多个拼写错误
当存在未封闭的头标记或不匹配的结束标记时
在collection
或association
的时间映射中在<resultMap>
标记内写入<if></if>
<case><case>
类型的标记时
当你在其他一些标签中写下一些并不存在的标签时
希望这些提示可以帮助某人。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.