我用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
对象。
以下是一种可能的解决方法:
将 orderAndDetail
查询方法的返回类型修改为 List<Order>
:
List<Order> order = orderMapper.orderAndDetail(100);
修改 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>
public interface OrderMapper {
List<Order> findAll();
}
问题原因是在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
对象。
请注意替换查询语句中的...
部分,将其替换为具体的字段名,以保证查询语句的正确性。