mybatis plus 一对多查询

发布时间 2023-06-09 17:27:03作者: ジ绯色月下ぎ

 

 

public interface HardwareParaMapper extends CommonMapper<HardwarePara> {

    @Select("select distinct rc.vehicle_id,rc.node_id,rc.project_id,hi.hardware_id,hi.hardware_name,hi.hardware_code,ef.function_id,ef.function_code,ef.function_description,hi.id as 'hardware_info_id' ,ef.id as 'element_function_id', "+
            "ep2.dict_name as 'hardware_location',ep3.dict_name as 'hardware_type' "+
            "from relational_component rc,element_function ef,hardware_info hi "+
            "left join element_parameter ep2 on hi.hardware_location = ep2.parameter_id and ep2.delete_flag = '0' "+
            "Left join element_parameter ep3 on hi.hardware_type = ep3.parameter_id and ep3.delete_flag = '0' "+
            "where rc.vehicle_id = #{vehicleId} and rc.relational_type = 'HW' " +
            "and rc.element_id = hi.hardware_id and hi.hardware_id = ef.element_id "+
            "and rc.delete_flag = '0' and hi.delete_flag = '0' and ef.delete_flag = '0'  and rc.element_id is not null "+
            "order by hi.id asc,ef.id asc"
    )
    @Results({
            @Result(property = "params", column = "hardware_id",
                    many = @Many(select = "com.saimo.sotif.fmea..mapper.HardwareParaMapper.findHardwareParam"))
    })
    public IPage<Map<String, Object>> findHardwarePara(Page page, String vehicleId);

    @Select("SELECT indicator_name as 'parameterName',indicator_unit as 'unit',indicator_value as 'parameterValue' FROM hardware_indicator_parameters WHERE hardware_id = #{hardwareId} and delete_flag = '0' ")
    List<HardwareParaVO> findHardwareParam(String hardwareId);

}
property = "params"  将子查询的结果映射到主查询的结果列表中 取值使用params
column = "hardware_id" 是主查询的字段 用来关联子查询 作为子查询的条件




在 MyBatis Plus 中进行一对多映射查询,你可以通过使用注解 `@TableField` 和 `@TableId` 来建立实体类之间的关联关系。

下面是一对多映射查询的一般步骤:

1. 创建实体类:
   - 创建主实体类(一的一方)和关联实体类(多的一方)。
   - 在主实体类中,使用 `@TableId` 注解标记主键字段,使用 `@TableField` 注解标记关联字段。
   - 在关联实体类中,使用 `@TableField` 注解标记关联字段。

2. 创建Mapper接口:
   - 创建主实体类对应的Mapper接口,继承 `BaseMapper` 接口。
   - 定义方法用于查询一对多关联数据,可以使用 `@Select` 注解或者 XML 配置来编写查询语句。

3. 编写查询逻辑:
   - 在查询方法中,通过 MyBatis Plus 的查询构造器 `QueryWrapper` 来构建查询条件。
   - 使用 `selectList` 方法进行查询,并指定要关联的关联字段。

以下是一个简单的示例:

主实体类 User:

```java
public class User {
    @TableId
    private Long id;
    private String username;
    @TableField(exist = false)
    private List<Order> orders;
    
    // 省略 getter 和 setter 方法
}
```

关联实体类 Order:

```java
public class Order {
    @TableId
    private Long id;
    private String orderNo;
    private Long userId;
    
    // 省略 getter 和 setter 方法
}
```

UserMapper 接口:

```java
public interface UserMapper extends BaseMapper<User> {
    @Select("SELECT * FROM user")
    @Results({
        @Result(property = "orders", column = "id",
                many = @Many(select = "com.example.mapper.OrderMapper.findByUserId"))
    })
    List<User> findAllWithOrders();
}
```

OrderMapper 接口:

```java
public interface OrderMapper extends BaseMapper<Order> {
    @Select("SELECT * FROM orders WHERE user_id = #{userId}")
    List<Order> findByUserId(Long userId);
}
```

在上述示例中,通过 `@Results` 注解和 `@Many` 注解建立了主实体类 User 和关联实体类 Order 之间的关系,指定了关联查询方法 `findByUserId`。在 UserMapper 接口的 `findAllWithOrders` 方法中,使用了 `@Select` 注解来编写 SQL 查询语句,并通过 `@Results` 注解将查询结果关联到 User 实体类的 orders 字段。

通过以上步骤,你可以实现一对多关联查询。调用 `findAllWithOrders` 方法即可查询出包含关联数据的 User 对象列表。