Mybatis 一对多连接未返回预期返回类型

我用mybatis 一对多映射 级联查询时 当调用orderAndDetail 时预期返回值应该是一个Order 类型,但是它返回了一个List
实体类:
Order:


```java

package entity;

import lombok.Data;
import lombok.Getter;
import lombok.Setter;

import java.util.List;

@Getter
@Setter
public class Order {
    private int id;
    private int userId;
    private String number;
    private String createtime;
    private String note;

    private User userAssociation;
    private List<OrderDetail> orderDetail;

    @Override
    public String toString() {
        return "Order{" +
                "id=" + id +
                ", userId=" + userId +
                ", number='" + number + '\'' +
                ", createtime='" + createtime + '\'' +
                ", note='" + note + '\'' +
                '}';
    }
}

OrderDetail:

```java
package mapper;

import entity.Order;

import java.util.List;

public interface OrderMapper {
    Order queryByIdAssociation(int id);

    Order queryByIdLazy(int id);
    Order orderAndDetail(int id);
}

接口:

OrderMapper:

```java


package mapper;

import entity.Order;

import java.util.List;

public interface OrderMapper {
    Order queryByIdAssociation(int id);

    Order queryByIdLazy(int id);
    Order orderAndDetail(int id);
}

OrderMapper.xml中涉及部分:

  <resultMap id="OrderMapDetail" type="Order" >
        <id property="id" column="detail_id"/>
        <collection property="orderDetail" ofType="OrderDetail">
            <id property="id" column="id"/>
        </collection>
    </resultMap>
    <select id="orderAndDetail" resultMap="OrderMapDetail">
        select o.*,od.id detail_id,od.item_id,od.item_num,od.order_id
        from `order` o,orderdetail od
        where o.id=od.order_id
        and o.id=#{OrderId}
    </select>

测试方法:

 @Test
    public void testSelect2() throws IOException {
       OrderMapper orderMapper = sqlSession.getMapper(OrderMapper.class);
        Order order = orderMapper.orderAndDetail(100);

        System.out.println(order);
        System.out.println(order.getOrderDetail());

    }

那你根据传进去的100这个值能查到几条数据呢?

根据你提供的代码和描述,问题出在你的 OrderMapper.xml 文件中的 orderAndDetail 查询方法上。你期望返回的是一个 Order 类型的对象,但实际上返回了一个 List<Order> 类型的结果。

解决这个问题的方法是修改你的 orderAndDetail 查询方法的返回类型为 List<Order>,或者修改查询语句以返回单个 Order 对象。

以下是一种可能的解决方法:

  1. orderAndDetail 查询方法的返回类型修改为 List<Order>

    List<Order> order = orderMapper.orderAndDetail(100);
    
  2. 修改 orderAndDetail 查询语句,只返回一个 Order 对象:

    <select id="orderAndDetail" resultMap="OrderMapDetail">
     select o.*,od.id detail_id,od.item_id,od.item_num,od.order_id
     from `order` o,orderdetail od
     where o.id=od.order_id
     and o.id=#{OrderId}
     limit 1  <!-- 添加限制,只返回一条记录 -->
    </select>
    
不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 这篇博客: Mybatis复杂映射开发:一对一、一对多、多对多查询中的 1.4、 创建OrderMapper.java接口 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:
    public interface OrderMapper {
    	List<Order> findAll();
    }
    
    
  • 以下回答来自chatgpt:

    问题原因是在OrderMapper.xml中的查询语句使用了LEFT JOIN,导致返回结果是一个多条记录的List,而不是预期的单个Order对象。

    解决方案是修改查询语句,使用GROUP BY语句将多条记录合并成一个结果。

    修改后的OrderMapper.xml

    <select id="orderAndDetail" resultMap="order">
        SELECT orders.order_id AS order_id,
               orders...,
               order_details.detail_id AS detail_id,
               order_details...
        FROM orders
        LEFT JOIN order_details ON orders.order_id = order_details.order_id
        WHERE orders.order_id = #{orderId}
        GROUP BY orders.order_id
    </select>
    

    这样修改后,在进行一对多映射的级联查询时,调用orderAndDetail方法会返回预期的单个Order对象。

    请注意替换查询语句中的...部分,将其替换为具体的字段名,以保证查询语句的正确性。


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