mybatis 一对多查询时 子查询为空则不显示 代码示例
时间: 2023-06-12 17:06:31 浏览: 165
假设我们有两个表,一个是`orders`表,一个是`order_items`表,`orders`表和`order_items`表是一对多的关系,即一个订单可以包含多个订单项。
我们要查询订单列表,同时查询每个订单的所有订单项。如果某个订单没有订单项,我们不希望该订单出现在结果集中。可以按照以下步骤实现:
1. 在`Order`类中定义一个`List<OrderItem>`类型的属性`orderItems`,并提供getter和setter方法。
```java
public class Order {
private Long id;
private Date createTime;
private List<OrderItem> orderItems;
// getter和setter方法省略
}
```
2. 撰写XML映射文件,使用`<select>`元素执行一对多查询。
```xml
<select id="getOrdersWithOrderItems" resultMap="OrderWithOrderItemsResultMap">
SELECT o.id, o.create_time, oi.id AS order_item_id, oi.order_id, oi.product_name, oi.product_price, oi.product_quantity
FROM orders o
LEFT JOIN order_items oi ON o.id = oi.order_id
WHERE oi.order_id IS NOT NULL
</select>
<resultMap id="OrderWithOrderItemsResultMap" type="Order">
<id property="id" column="id" />
<result property="createTime" column="create_time" />
<collection property="orderItems" ofType="OrderItem">
<id property="id" column="order_item_id" />
<result property="orderId" column="order_id" />
<result property="productName" column="product_name" />
<result property="productPrice" column="product_price" />
<result property="productQuantity" column="product_quantity" />
</collection>
</resultMap>
```
3. 在`OrderMapper`接口中声明方法`getOrdersWithOrderItems`,并使用`@ResultMap`注解指定结果集映射。
```java
public interface OrderMapper {
@Select("getOrdersWithOrderItems")
@ResultMap("OrderWithOrderItemsResultMap")
List<Order> getOrdersWithOrderItems();
}
```
在上述XML映射文件中,我们使用了LEFT JOIN来保证即使某个订单没有订单项,该订单也会出现在结果集中,但是在WHERE子句中使用了`oi.order_id IS NOT NULL`这个条件来排除掉没有订单项的订单。这样就可以实现查询时子查询为空则不显示的效果了。
阅读全文