mybatisplusxml中映射关系的问题

img

这4个表在mybatisplus中xml文件中的resultMap的映射关系该怎么写呀?求解答

查询结果中的字段名即为column列。

<resultMap id="resultMap" type="entity全限定路径名">
    <id column="lotId" property="lotId" r/>
    <result column="lotName" property="lotName" />
    <result column="count" property="count" />
    <result column="total" property="total" />
</resultMap>

你这sql挺长,如果上线用能扛得住吗

新建一个对象接收不行吗

定义一个POJO为返回值即可,对象属性命名同查询结果列一致,底层框架会自动注入。

直接上代码,你试试,报错叫我,

<!-- 在对应的Mapper XML文件中定义结果映射 -->
<resultMap id="customResultMap" type="com.example.entity.CustomEntity">
    <id column="lotId" property="lotId" />
    <result column="lotName" property="lotName" />
    <result column="count" property="count" />
    <result column="total" property="total" />
</resultMap>

<!-- 在相应的Mapper XML文件中编写查询语句 -->
<select id="yourQueryMethod" resultMap="customResultMap">
    SELECT lotId, lotName, count, total
    FROM (
        SELECT
            H.lot_id AS lotId,
            L.name AS lotName,
            IFNULL(COUNT(1), 0) AS count,
            IFNULL(SUM(H.total_fee), 0) AS total
        FROM (
            SELECT H.lot_id, SUBSTR(H.create_date FROM 1 FOR 10) AS create_date, H.total,
                H.residue, H.status
            FROM history H
            LEFT JOIN activity A ON H.activity_id = A.id
            WHERE A.config_id = #{0}
                AND H.create_date LIKE CONCAT(SUBSTR(DATE_SUB(NOW(), INTERVAL 1 DAY)) FROM 1 FOR 10), '%'
            UNION ALL
            SELECT H.user_id, SUBSTR(H.create_date FROM 1 FOR 10) AS create_date, H.total,
                H.residue, H.status
            FROM discount H
            LEFT JOIN activity A ON H.activity_id = A.id
            WHERE A.config_id = #{0}
                AND H.create_date LIKE CONCAT(SUBSTR(DATE_SUB(NOW(), INTERVAL 1 DAY)) FROM 1 FOR 10), '%'
        ) A
        LEFT JOIN lot L ON L.id = A.lot_id
        GROUP BY A.lot_id, L.name
        ORDER BY COUNT DESC
        LIMIT 10
    ) B
    UNION ALL
    SELECT lotId, lotName, NULL AS count, NULL AS total
    FROM lot
    WHERE config_id = #{0}
    LIMIT 10
    GROUP BY lotId, lotName
    ORDER BY COUNT DESC
    LIMIT 10
</select>

你先试试,没法测试

<resultMap id="lotResultMap" type="com.example.entity.Lot">
    <id column="lotId" property="lotId"/>
    <result column="lotName" property="lotName"/>
    <result column="count" property="count"/>
    <result column="totalFee" property="totalFee"/>
</resultMap>
<select id="selectLotByConfigId" parameterType="java.lang.Long" resultMap="lotResultMap">
    select lotid, lotName,count, total from
    ((select issue_lot_id lotId, l.name lotName, ifnull(count(1), 0) count,ifnull(sum(total_fee),0) totalFee from
    (select h.user_id, h.lot_id, SUBSTR(h.create_date FROM 1 FOR 10) create_date, h.total_fee, h.residue, h.status
    from history h left join activity a on h.activity_id = a.id 
    where a.config_id = #{configId} and h.create_date like CONCAT(SUBSTR(DATE_SUB(NOW(),INTERVAL 1 DAY) FROM 1 FOR 10),'%')
    union all
    select h.user_id,SUBSTR(h.create_date FROM 1 FOR 10) create_date, h.total_fee, h.residue, h.status
    from discount h left join activity a on h.activity_id = a.id
    where a.config_id = #{configId} and h.create_date like CONCAT(SUBSTR(DATE_SUB(NOW(),INTERVAL 1 DAY) FROM 1 FOR 10),'%')
    ) x
    left JOIN lot l on l.id = x.lot_id 
    group by x.user_id, l.name order by count desc limit 10)
    union all
    (select * from lot where config_id = #{configId} limit 10)) y
    group by Id, Name order by count desc limit 10
</select>


【以下回答由 GPT 生成】

首先,对于mybatisplus的xml文件中的resultMap的映射,可以使用以下方式来实现这4个表的关系。

假设有4个表A、B、C、D,且它们之间的关系为A与B是一对多关系,B与C是一对一关系,C与D是多对多关系。

首先,我们需要在xml中定义这4个表的resultMap。

对于表A,resultMap可以定义如下:

<resultMap id="aResultMap" type="com.example.model.A">
  <id property="id" column="id" />
  <result property="name" column="name" />

  <!-- 映射A与B的关系 -->
  <collection property="bList" ofType="com.example.model.B" resultMap="bResultMap"/>
</resultMap>

对于表B,resultMap可以定义如下:

<resultMap id="bResultMap" type="com.example.model.B">
  <id property="id" column="id" />
  <result property="name" column="name" />

  <!-- 映射B与A的关系 -->
  <association property="a" javaType="com.example.model.A" resultMap="aResultMap"/>

  <!-- 映射B与C的关系 -->
  <association property="c" javaType="com.example.model.C" resultMap="cResultMap"/>
</resultMap>

对于表C,resultMap可以定义如下:

<resultMap id="cResultMap" type="com.example.model.C">
  <id property="id" column="id" />
  <result property="name" column="name" />

  <!-- 映射C与B的关系 -->
  <association property="b" javaType="com.example.model.B" resultMap="bResultMap"/>

  <!-- 映射C与D的关系 -->
  <collection property="dList" ofType="com.example.model.D" resultMap="dResultMap"/>
</resultMap>

对于表D,resultMap可以定义如下:

<resultMap id="dResultMap" type="com.example.model.D">
  <id property="id" column="id" />
  <result property="name" column="name" />

  <!-- 映射D与C的关系 -->
  <association property="c" javaType="com.example.model.C" resultMap="cResultMap"/>
</resultMap>

通过上述定义的resultMap,我们可以实现这4个表之间的映射关系。

注意,在以上的示例中,假设表A的字段为id和name,表B的字段为id和name,表C的字段为id和name,表D的字段为id和name。具体的字段和映射关系,需要根据实际的表结构和字段进行调整。

如果表结构和字段与示例中的示例不一致,你需要根据实际情况进行相应的调整和修改。

如果这些示例和解释不能满足你的需求,你也可以补充提供更多的信息,以便我能够更好地帮助你解决问题。



【相关推荐】



如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

先优化再写吧

推荐使用注解的方式来写
比如下面的,具体的实体你可以根据查询的数据结果进行定义

 @Select("SELECT * FROM user WHERE age > 18")
    List<User> selectAdultUsers();

参考如下XML代码:

<!-- 结果映射 -->
<resultMap id="customResultMap" type="com.example.entity.CustomEntity">
    <id column="lotId" property="lotId" />
    <result column="lotName" property="lotName" />
    <result column="count" property="count" />
    <result column="total" property="total" />
</resultMap>
<select id="yourQueryMethod" resultMap="customResultMap">
    SELECT lotId, lotName, count, total
    FROM (
        SELECT
            H.lot_id AS lotId,
            L.name AS lotName,
            IFNULL(COUNT(1), 0) AS count,
            IFNULL(SUM(H.total_fee), 0) AS total
        FROM (
            SELECT H.lot_id, SUBSTR(H.create_date FROM 1 FOR 10) AS create_date, H.total,
                H.residue, H.status
            FROM history H
            LEFT JOIN activity A ON H.activity_id = A.id
            WHERE A.config_id = #{0}
                AND H.create_date LIKE CONCAT(SUBSTR(DATE_SUB(NOW(), INTERVAL 1 DAY)) FROM 1 FOR 10), '%'
            UNION ALL
            SELECT H.user_id, SUBSTR(H.create_date FROM 1 FOR 10) AS create_date, H.total,
                H.residue, H.status
            FROM discount H
            LEFT JOIN activity A ON H.activity_id = A.id
            WHERE A.config_id = #{0}
                AND H.create_date LIKE CONCAT(SUBSTR(DATE_SUB(NOW(), INTERVAL 1 DAY)) FROM 1 FOR 10), '%'
        ) A
        LEFT JOIN lot L ON L.id = A.lot_id
        GROUP BY A.lot_id, L.name
        ORDER BY COUNT DESC
        LIMIT 10
    ) B
    UNION ALL
    SELECT lotId, lotName, NULL AS count, NULL AS total
    FROM lot
    WHERE config_id = #{0}
    LIMIT 10
    GROUP BY lotId, lotName
    ORDER BY COUNT DESC
    LIMIT 10
</select>


建议还是写个对象实体来接收吧,这样可读性也比较高、容易维护

建这直接在mapper.java文件中使用@Select注解,不用考虑resultmap。
例:

//相当于 XML 文件中的<Select>标签 @Select("select * from user") List<User> getUsers();

MyBatisPlus映射与表名映射常见问题
可以参考下

可以考虑在相应的Mapper XML文件中编写查询语句 ,甚至可以使用使用了 标签来动态地添加查询条件

MybatisPlus 实体类与数据库表映射关系&MybatisPlus:ORM思想_实体类映射数据库注解_Archie_java的博客-CSDN博客 在开发中可能会遇到MyBatis-Plus使用实体类属性进行SQL操作,但是不用存到数据库中去查找,这时候我们的实体中有这个属性,但是数据库的表中没有这个字段(即:实体类属性非数据库表字段),如果不做处理就会报错。例如MyUserTable 对应的数据库表为 my_user_table;TEMyUserTable 对应表名为t_e_my_user_table;在类名上方添加@TableName(“my_user_table”)在实体类的属性上面加上这个注解后,此字段就不会映射数据库了。......_实体类映射数据库注解 https://blog.csdn.net/qq_43842093/article/details/126556518?ops_request_misc=&request_id=&biz_id=102&utm_term=mybatisplusxml%E4%B8%AD%E6%98%A0%E5%B0%84%E5%85%B3%E7%B3%BB%E7%9A%84%E9%97%AE%E9%A2%98&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-0-126556518.142^v93^chatsearchT3_2&spm=1018.2226.3001.4187