askwiki
mybaitsplus controller能直接leftjoin 别的表么查询么
mybaitsplus controller能直接leftjoin 别的表么查询么
@GetMapping("/page") @ApiOperation(value = "获取符合条件的资源") public IPage<SecUserLog> page(@RequestParam(defaultValue = "1") int offset, @RequestParam(defaultValue = "10") int limit, @RequestParam(required = false) String order, @RequestParam(required = false) boolean asc, @RequestParam(required = false) Map<String, Object> params) { QueryWrapper<SecUserLog> query = new QueryWrapper<>(); if (StringUtils.isNotEmpty(String.valueOf(params.get("userId")))) { query.eq("user_id", params.get("userId")); } if (StringUtils.isNotEmpty(String.valueOf(params.get("begWorkday")))) { query.ge("STLMT_DATE", params.get("begWorkday")); } if (StringUtils.isNotEmpty(String.valueOf(params.get("endWorkday")))) { query.le("STLMT_DATE", params.get("endWorkday")); } query.apply("TBL_SEC_USER_INFO b on USER_ID = b.USER_ID "); query.select("STLMT_DATE", "SEQ_NO","b.emp_code","RIGHT_ID","OPR_TYPE","OPR_DESC","OPR_TERM_IP","OPR_TMS"); query.orderByDesc("OPR_TMS"); return secUserLogService.page(new Page<>(offset / limit + 1, limit), query); } ### Cause: com.baomidou.mybatisplus.core.exceptions.MybatisPlusException: Error: Method queryTotal execution error of sql : SELECT COUNT(1) FROM ( SELECT STLMT_DATE,SEQ_NO,b.emp_code,RIGHT_ID,OPR_TYPE,OPR_DESC,OPR_TERM_IP,OPR_TMS FROM TBL_SEC_USER_LOG WHERE (STLMT_DATE >= ? AND STLMT_DATE <= ? AND TBL_SEC_USER_INFO b on USER_ID = b.USER_ID ) ORDER BY OPR_TMS DESC ) TOTAL

OpenAI回答

在使用MyBatis-Plus进行多表连接查询时,官方没有提供直接的解决方案。不过,确实有解决这种需求的方法。具体来说,可以通过以下两种方式实现:

  1. 使用XML文件解决方案:

    • 在Mapper XML配置文件中定义复杂的SQL查询语句(如JOIN语句),然后在Mapper接口中调用这些SQL配置。
    • 通过这种方式,可以灵活地使用原生SQL完成多表查询。
  2. 自定义方法解决方案:

    • 如果不喜欢通过XML文件配置复杂SQL,可以在Service层或更高层次自定义需要的查询方法,从而实现多表联查的需求。例如,先用查询语句获取结果,再进行对象映射和结果处理。

下面是一个简单的示例,展示如何在XML文件中进行多表查询:

Mapper XML文件

<select id="selectUsersWithOrders" resultType="User">
    SELECT u.*, o.id as order_id, o.order_number
    FROM user u
    LEFT JOIN orders o ON u.id = o.user_id
</select>

Mapper接口

public interface UserMapper {
    List<User> selectUsersWithOrders();
}

Service层调用

public class UserService {
    @Autowired
    private UserMapper userMapper;

    public List<User> getUsersWithOrders() {
        return userMapper.selectUsersWithOrders();
    }
}

这种方式通过在userMapper.xml文件中定义一个selectUsersWithOrders方法,使用LEFT JOIN进行多表查询,然后通过UserMapper接口和Service层调用完成查询功能。

详情可以参考MybatisPlus多表查询。希望这能帮到你!

继续提问

Moonshot回答

MyBatis Plus 是一个流行的 MyBatis 增强工具,它提供了一些简化数据库操作的功能。然而,MyBatis Plus 原生并不支持直接的 leftJoin 操作。如果你需要进行联表查询,可以使用 MyBatis Plus 的扩展工具 MyBatis Plus-Join(简称 MPJ),它提供了 leftJoinrightJoin 等操作,允许你以类似 MyBatis Plus 的方式进行联表查询。

根据搜索结果,你可以在项目中添加 MyBatis Plus-Join 的依赖,然后使用它提供的 wrapper.leftJoin() 方法来实现 LEFT JOIN 查询。例如,你可以在 MyBatis Plus 的 IServiceBaseMapper 接口中定义联表查询的方法,并使用 @Select 注解来编写联表 SQL 语句。

如果你在使用 MyBatis Plus 的过程中没有找到 leftJoin 方法的提示,可能是因为你的版本不支持该方法或者你的 IDE 的自动补全功能没有正确提示。请确保你使用的是支持该方法的版本,并且 IDE 配置正确。

有关 MyBatis Plus-Join 的更多信息和使用方法,你可以访问以下链接获取详细信息和示例代码:

继续提问

Moonshot回答

您遇到的错误是 MybatisPlusException,这通常是由于 MyBatis Plus 在执行 SQL 查询时遇到了问题。错误信息中提到的 Error: Method queryTotal execution error of sql 指出在执行查询总数的方法时出现了错误。

问题可能出在 SQL 语句的语法上。在您的代码中,您尝试使用 query.apply 来添加一个左连接(LEFT JOIN),但是 SQL 语句的语法似乎不正确。在 query.apply 中,您应该使用正确的 SQL 语法来表达连接操作。

正确的语法应该是使用 LEFT JOIN 而不是直接写表名和别名。例如:

query.apply("LEFT JOIN TBL_SEC_USER_INFO b ON TBL_SEC_USER_LOG.USER_ID = b.USER_ID");

此外,您的 query.select 方法中直接列出了字段名,但是在 query.apply 中没有包含这些字段的表别名,这可能会导致字段名冲突或错误。确保在 query.select 中使用正确的表别名和字段名。

根据您提供的代码,这是修改后的查询构建器的示例:

@GetMapping("/page")
@ApiOperation(value = "获取符合条件的资源")
public IPage<SecUserLog> page(@RequestParam(defaultValue = "1") int offset,
                              @RequestParam(defaultValue = "10") int limit,
                              @RequestParam(required = false) String order,
                              @RequestParam(required = false) boolean asc,
                              @RequestParam(required = false) Map<String, Object> params) {
    QueryWrapper<SecUserLog> query = new QueryWrapper<>();
    if (StringUtils.isNotEmpty(String.valueOf(params.get("userId")))) {
        query.eq("user_id", params.get("userId"));
    }
    if (StringUtils.isNotEmpty(String.valueOf(params.get("begWorkday")))) {
        query.ge("STLMT_DATE", params.get("begWorkday"));
    }
    if (StringUtils.isNotEmpty(String.valueOf(params.get("endWorkday")))) {
        query.le("STLMT_DATE", params.get("endWorkday"));
    }
    // 修正 JOIN 语句
    query.apply("LEFT JOIN TBL_SEC_USER_INFO b ON TBL_SEC_USER_LOG.USER_ID = b.USER_ID");
    // 确保 SELECT 语句中的字段名包含正确的表别名
    query.select("TBL_SEC_USER_LOG.STLMT_DATE", "TBL_SEC_USER_LOG.SEQ_NO", "b.emp_code", "TBL_SEC_USER_LOG.RIGHT_ID", "TBL_SEC_USER_LOG.OPR_TYPE", "TBL_SEC_USER_LOG.OPR_DESC", "TBL_SEC_USER_LOG.OPR_TERM_IP", "TBL_SEC_USER_LOG.OPR_TMS");
    // 如果需要根据 order 和 asc 参数动态排序,可以添加如下代码
    if (order != null && !order.isEmpty()) {
        query.orderBy(true, asc, order);
    } else {
        query.orderByDesc("OPR_TMS");
    }
    return secUserLogService.page(new Page<>(offset / limit + 1, limit), query);
}

请注意,如果 order 参数用于动态排序,您需要确保它对应于数据库中正确的字段名,并且如果字段名在多个表中存在,您需要指定正确的表别名。

如果问题仍然存在,请检查您的数据库表结构和字段名是否与代码中的一致,以及是否有任何数据库级别的问题导致查询失败。

继续提问

津ICP备19006161号