# mybatis/mybatis plus中sql语句order by不生效解决方案

在使用MyBatis或MyBatisPlus时,可能会遇到XML配置文件中的orderby排序不起作用的情况。这通常由于框架内部的SQL优化导致orderby被移除。为了解决这个问题,可以采取在SQL语句中保留orderby关键字或者直接在末尾添加保留字段的方法,确保排序正常执行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言:在mybatis或mybatis plus的xml文件中会遇到order by不生效的问题,特别是在整个sql语句中间进行order by排序会失效,这是因为框架内部机制将整个sql语句进行过滤优化,将order by剔除,这时候加个对order by关键字的保留,如下图:

在这里插入图片描述
或者直接在后面追加保留字段
在这里插入图片描述

### 使用 MyBatis-Plus 实现多表连接查询 MyBatis-Plus 提供了一种简单的方式来实现多表连接查询。虽然其核心功能主要围绕单表操作设计,但借助 `mybatis-plus-join` 插件以及自定义拦截器可以轻松完成复杂的多表联查。 #### 1. 多表联查的核心组件 为了实现多表联查,开发者可以通过以下两种方式来构建查询逻辑: - **MPJLambdaWrapper**:这是由 `mybatis-plus-join` 插件提供的一种条件构造器,允许用户像使用 `LambdaQueryWrapper` 那样编写链式调用的 SQL 条件语句[^2]。 - **selectJoinList 方法**:该方法来自 `MPJBaseMapper` 接口,用于执行多表联合查询并返回指定的结果集对象[^4]。 以下是具体的实现步骤和代码示例。 --- #### 2. 添加依赖项 在项目中引入必要的 Maven 或 Gradle 依赖项以支持多表联查功能。例如,在 `pom.xml` 文件中添加如下内容: ```xml <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-extension</artifactId> <version>最新版本号</version> </dependency> <!-- 如果需要 mybatis-plus-join 功能 --> <dependency> <groupId>mpj</groupId> <artifactId>mybatis-plus-join</artifactId> <version>对应版本号</version> </dependency> ``` --- #### 3. 创建实体类与 Mapper 接口 假设存在两个表:`user` 和 `order`,分别表示用户信息和订单记录,则对应的 Java 实体类可能如下所示: ```java @Data public class User { private Long id; private String name; } @Data public class Order { private Long orderId; private Long userId; // 关联字段 private BigDecimal amount; } ``` 接着创建一个 DTO 类用来接收查询结果数据: ```java @Data public class UserOrderDTO { private Long userId; private String userName; private Long orderId; private BigDecimal orderAmount; } ``` 随后为 `User` 表配置相应的 Mapper 接口,并继承 `MPJBaseMapper<User>` 而不是普通的 `BaseMapper<User>`: ```java @Mapper public interface UserMapper extends MPJBaseMapper<User> {} ``` --- #### 4. 编写查询逻辑 利用 `MPJLambdaWrapper` 构建查询条件并通过 `selectJoinList` 执行实际查询操作。下面是一个完整的例子: ```java @Service public class UserService { @Autowired private UserMapper userMapper; public List<UserOrderDTO> getUserOrders() { MPJLambdaWrapper<User> wrapper = new MPJLambdaWrapper<>(); // 设置主表 (user),并加入关联子表 (order) 的 JOIN 查询条件 wrapper.select(User.class, u -> Arrays.asList(u.getId(), u.getName())) .selectAs(Order::getOrderId, UserOrderDTO::getOrderId) .selectAs(Order::getAmount, UserOrderDTO::getOrderAmount) .leftJoin(Order.class, o -> o.getUserId().eq(User::getId))); return userMapper.selectJoinList(wrapper, UserOrderDTO.class); } } ``` 上述代码片段展示了如何通过设置不同的 SELECT 子句选择目标列,并将它们映射到最终的目标 DTO 中去][^[^24]。 --- #### 5. 自定义拦截器(可选) 如果希望进一步扩展框架能力或者解决某些特殊场景下的需求,还可以考虑注册自定义拦截器。比如按照官方文档中的指导修改 SqlSession 工厂 Bean 定义即可生效[^5]: ```java @Bean public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception { MybatisSqlSessionFactoryBean factoryBean = new MybatisSqlSessionFactoryBean(); factoryBean.setDataSource(dataSource); Interceptor[] plugins = {new MyInterceptor()}; factoryBean.setPlugins(plugins); return factoryBean.getObject(); } ``` --- ### 总结 综上所述,MyBatis-Plus 支持多种途径来进行高效的多表连接查询处理。无论是采用内置插件还是自行定制解决方案都能满足大多数业务需求。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值