和麻 2024-12-20 16:56 采纳率: 0%
浏览 5

MybatisPlus+MybatisPlusJoin

实体类:

@TableName("t_hosp_ziping_onsite_harmonize")
@Data
@AllArgsConstructor
@NoArgsConstructor
public class ThospOnsiteHarmonize extends MPJBaseEntity {
    //主键id
    @TableId
    private Long id;
    //自评id
    private Long zipingId;
    //第三部分主表id
    private Long onsiteId;
    //指标编号
    private String indexCode;
    //申请人
    private String claimantBy;
    //创建时间
    private Date claimantTime;
    //审核人
    private String processBy;
    //审核时间
    private DateTime processTime;
    //协调说明
    private String harmonizeReason;
    //协调状态 1申请 2.同意 3.驳回
    private Integer state;
    //驳回原因
    private String turnDown;
    //协助人员
    private String harmonizeBy;
    @TableField(exist = false)
    private String indexName;
    //督导
    @TableField(exist = false)
    private String dudaoCode;

    @TableField(exist = false)
    private List<ThospOnsiteHarmonizeDetail> details;
    @TableField(exist = false)
    private List<OperationLog> logs;

}

@TableName("t_hosp_ziping_onsite_harmonize_detail")
@Data
@AllArgsConstructor
@NoArgsConstructor
public class ThospOnsiteHarmonizeDetail extends MPJBaseEntity {
    //主键id
    @TableId
    private Long id;
    //协调主表id
    private Long harmonizeId;
    //发起人
    private String claimantBy;
    //协助人
    private String harmonizeBy;
    //协助时间
    private Date harmonizeTime;
    //协助说明
    private String reason;
    //协助状态 1.协助中 2.已完成 3.无法协助
    private Integer state;
    //无法协助说明
    private String turnDown;

    /*
    承办人(用于权限控制)
    */
    @TableField(exist = false)
    private String chengbanCode;
    //协调明细
    @TableField(exist = false)
    private List<OperationLog> logs;
}
@Data
@AllArgsConstructor
@NoArgsConstructor
@TableName("t_hosp_ziping_onsite_operation_log")
public class OperationLog extends MPJBaseEntity {
    //主键id
    @TableId
    private Long id;
    //自评id
    private Long zipingId;
    //指标名称
    private String indexCode;
    //指标类型,第二部分,第三部分
    private Integer indexType;
    //操作时间
    private Date operationTime;
    //操作状态
    private Integer operationState;
    //操作状态描述
    private String operationStateStory;
    //操作人
    private String operator;
    //操作说明(驳回说明,协调说明等)
    private String operationDetails;
}





```我想要实现一对多查询,使用mybatis-plus-join-boot-starter框架进行连表查询,ThospOnsiteHarmonize有一个字段为List<ThospOnsiteHarmonizeDetail> details;;其中ThospOnsiteHarmonizeDetail有一个字段为List<OperationLog> logs;我想要的结果集为
    
```java
    [Harmonize: Harmonize A
Detail: Detail A1[
{Log: Log A1-2}
],
Detail: Detail A2[
{Log,{
}: Log A2-1},{Log: Log A2-2
}
]
        ]

业务代码为:


```java
wrapper1.selectAll(ThospOnsiteHarmonize.class)
                .selectCollection(ThospOnsiteHarmonizeDetail.class, ThospOnsiteHarmonize::getDetails)
                .selectCollection(OperationLog.class, ThospOnsiteHarmonizeDetail::getLogs)
                .innerJoin(ThospOnsiteHarmonizeDetail.class, ThospOnsiteHarmonizeDetail::getHarmonizeId, ThospOnsiteHarmonize::getId)
                .innerJoin(THospZiPing.class, THospZiPing::getId, ThospOnsiteHarmonize::getZipingId)
                .eq(THospZiPing::getState, ZiPingStateEnum.PROCESS.getCode())
                .eq(THospZiPing::getZiPingRealm, IndexTypeEnum.THIRD.getInfo())
                .innerJoin(OperationLog.class, OperationLog::getId, ThospOnsiteHarmonizeDetail::getId)
                .eq(ThospOnsiteHarmonize::getIndexCode, indexCode)
                .orderByAsc(ThospOnsiteHarmonize::getIndexCode);
        // 执行查询并返回结果
        List<ThospOnsiteHarmonize> thospOnsiteHarmonizes = thospOnsiteHarmonizeMapper.selectJoinList(ThospOnsiteHarmonize.class, wrapper1);

使用postman调用方法结果集显示为:


    [
        Detail: Detail A1,
Log: Log A1-1,
Log: Log A1-2,
Detail: Detail A2,
Log: Log A2-1,
Log: Log A2-2,
        ]

```为什么log的数据没有被映射到List<OperationLog> logs中,而是和List<ThospOnsiteHarmonizeDetail> details;平级。是业务代码映射哪里写错了吗,找了半天没找到问题。
  • 写回答

1条回答 默认 最新

  • 道友老李 JWE233286一种基于机器视觉的水表指针读数识别及修正的方法 专利发明者 2024-12-20 17:01
    关注
    让【道友老李】来帮你解答,本回答参考通义千问大模型编写,并整理提供,如果还有疑问可以点击头像关注私信或评论。
    如果答案让您满意,请采纳、关注,非常感谢!
    ### 问题分析

    根据你提供的代码和结果集,可以看出 OperationLog 的数据没有正确映射到 ThospOnsiteHarmonizeDetail 中的 List<OperationLog> logs 字段,而是与 List<ThospOnsiteHarmonizeDetail> details 平级显示。这通常是由于 MyBatis-Plus Join 框架在处理多层嵌套查询时,字段映射关系不明确或配置不当导致的。

    解决方案

    要确保 OperationLog 正确映射到 ThospOnsiteHarmonizeDetail 中的 logs 列表,需要调整你的查询逻辑,特别是确保每个层级的关联关系清晰明确。以下是具体的解决方案:

    1. 修改业务代码

    首先,确保 selectCollection 方法的调用顺序和参数正确。你需要先将 ThospOnsiteHarmonizeDetail 映射到 ThospOnsiteHarmonizedetails 字段,然后再将 OperationLog 映射到 ThospOnsiteHarmonizeDetaillogs 字段。

    Wrapper wrapper1 = new QueryWrapper<ThospOnsiteHarmonize>()
        .select("t1.*, t2.*, t3.*")
        .selectCollection(ThospOnsiteHarmonizeDetail.class, ThospOnsiteHarmonize::getDetails)
        .selectCollection(OperationLog.class, (ThospOnsiteHarmonizeDetail detail) -> detail.getLogs())
        .innerJoin(ThospOnsiteHarmonizeDetail.class, "t2", "t2.harmonize_id = t1.id")
        .innerJoin(THospZiPing.class, "t4", "t4.id = t1.ziping_id")
        .eq("t4.state", ZiPingStateEnum.PROCESS.getCode())
        .eq("t4.ziping_realm", IndexTypeEnum.THIRD.getInfo())
        .innerJoin(OperationLog.class, "t3", "t3.id = t2.id") // 注意这里的关联条件是否正确
        .eq("t1.index_code", indexCode)
        .orderByAsc("t1.index_code");
    
    // 执行查询并返回结果
    List<ThospOnsiteHarmonize> thospOnsiteHarmonizes = thospOnsiteHarmonizeMapper.selectJoinList(ThospOnsiteHarmonize.class, wrapper1);
    

    2. 确保实体类中的字段映射正确

    确保 ThospOnsiteHarmonizeDetailOperationLog 实体类中使用了正确的注解来标识字段是否存在于数据库表中。

    @TableField(exist = false)
    private List<OperationLog> logs;
    

    3. 使用别名避免字段冲突

    为了防止字段冲突,可以在 SQL 查询中使用别名。例如:

    .select("t1.*, t2.*, t3.*, t3.id as log_id, t3.operation_time as log_operation_time, ...")
    

    4. 检查 MyBatis-Plus 版本

    确保你使用的 MyBatis-Plus 和 MyBatis-Plus-Join 插件版本是兼容的,并且是最新的稳定版本。有时候版本不匹配会导致一些未知问题。

    5. 调试 SQL 日志

    开启 MyBatis 的 SQL 日志输出,查看生成的 SQL 语句,确保 SQL 语句的结构和字段映射是正确的。

    mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
    

    示例代码

    以下是修改后的完整示例代码:

    Wrapper wrapper1 = new QueryWrapper<ThospOnsiteHarmonize>()
        .select("t1.*, t2.*, t3.*")
        .selectCollection(ThospOnsiteHarmonizeDetail.class, ThospOnsiteHarmonize::getDetails)
        .selectCollection(OperationLog.class, (ThospOnsiteHarmonizeDetail detail) -> detail.getLogs())
        .innerJoin(ThospOnsiteHarmonizeDetail.class, "t2", "t2.harmonize_id = t1.id")
        .innerJoin(THospZiPing.class, "t4", "t4.id = t1.ziping_id")
        .eq("t4.state", ZiPingStateEnum.PROCESS.getCode())
        .eq("t4.ziping_realm", IndexTypeEnum.THIRD.getInfo())
        .innerJoin(OperationLog.class, "t3", "t3.id = t2.id") // 注意这里的关联条件是否正确
        .eq("t1.index_code", indexCode)
        .orderByAsc("t1.index_code");
    
    // 执行查询并返回结果
    List<ThospOnsiteHarmonize> thospOnsiteHarmonizes = thospOnsiteHarmonizeMapper.selectJoinList(ThospOnsiteHarmonize.class, wrapper1);
    

    总结

    通过以上步骤,你应该能够解决 OperationLog 数据没有正确映射到 ThospOnsiteHarmonizeDetail 中的问题。关键是确保每个层级的关联关系明确,并且字段映射正确。如果问题仍然存在,建议进一步检查 SQL 日志和 MyBatis-Plus 配置。

    评论

报告相同问题?

问题事件

  • 创建了问题 12月20日