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