mybatis plus 一对多查询

 

 


public interface HarmBehavorHardwareParaMapper extends CommonMapper<HarmBehavorHardwarePara> {

@Select("select distinct rc.vehicle_id,rc.node_id,rc.project_id,hi.hardware_id,hi.hardware_id as 'hardware_ids',hi.hardware_name,hi.hardware_code,ef.function_id, ef.function_id as 'func_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_ids",
many = @Many(select = "com.saimo.sotif.fmea.harmBehavor.mapper.HarmBehavorHardwareParaMapper.findHardwareParam")),
@Result(property = "leads", column = "{vehicleId = vehicle_id,hardwareId=hardware_ids,funcId=func_id}",
many = @Many(select = "com.saimo.sotif.fmea.harmBehavor.mapper.HarmBehavorHardwareParaMapper.findLeadType"))
})
public IPage<Map<String, Object>> findHarmBehavorHardwarePara(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);


@Select("select hbd.business_id as 'onlyId',hbi.only_id as 'dictId',hbi.description as 'dictValue',hbi.code as 'dictCode',hbd.lead_type as 'leadType' "+
"from harm_behavor_hardware_para hbsf left join harm_behavor_detail hbd "+
"on hbsf.only_id = hbd.business_id and hbd.delete_flag = 0 "+
"left join harm_behavor_info hbi on hbd.harm_behavor_id = hbi.only_id and hbi.delete_flag = 0 "+
"where hbsf.vehicle_id = #{vehicleId} and hbsf.hardware_id = #{hardwareId} and hbsf.func_id = #{funcId} and hbsf.delete_flag = 0 and hbd.business_type ='2' "
)
List<HarmBehavorVO> findLeadType(String vehicleId,String hardwareId, String funcId);
}


property = "params" 将子查询的结果映射到主查询的结果列表中 取值使用params
column = "hardware_ids" 是主查询的字段 用来关联子查询 作为子查询的条件(相当于传入参数)
这里需要注意一点 如果column的字段是
hardware_id 则主查询中获取到的hardware_id是null,有点坑,注意多查询一次用别名传参
多个参数传递的是column="{id=id, phone=phone}"



在 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 对象列表。

 






















posted @ 2023-06-09 17:16  ジ绯色月下ぎ  阅读(484)  评论(0编辑  收藏  举报