SQL执行没问题,mybatis调用该执行报错“未明确定义列”

在使用Mybatis进行SQL查询Oracle数据库时,如果SQL语句中存在重复定义的字段,会导致未明确定义列的错误。虽然在SQL工具中执行没有问题,但在Mybatis中执行该查询会出错。删除重复的字段后,问题得到解决。查询涉及到的表为HIS_STOCK_INFO,错误出现在STORE_UNIT,PHAR_UNIT,RETAIL_UNIT字段的重复定义上。

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

在此记录个BUG,mybatis的,SQL查询Oracle数据,SQL中重复定义查询了字段,就会导致报错未明确定义列,放到SQL工具中执行没问题,就是mybatis调用组装SQL后,再去查询数据,就要提示未明确定义列,但是又找不出是哪一个。删掉重复的就行了

 SELECT
	dsii.GOODS_ID AS goodsId,
	dsii.STORE_UNIT AS storeUnit,
	dsii.STORE_LEVEL AS storeLevel,
	dsii.STORE_SPEC AS storeSpec,
	dsii.PHAR_SPEC AS pharSpec,
	dsii.STORE_FACTOR AS storeFactor,
	dsii.PHAR_FACTOR AS pharFactor,
	dsii.PRICE_PURCHASE_PHAR AS pricePurchasePhar,
	dsii.PRICE_RETAIL_PHAR AS priceRetailPhar,
	dsii.PHAR_UNIT AS pharUnit,
	dsii.RETAIL_UNIT AS retailUnit,
	dsii.STOCK_ID AS stockId,
	dsii.AMOUNT_RETAIL + nvl(fun_get_inventory_amount(dsii.hospital_id, dsii.store_id, dsii.stock_id), 0) AS amountRetail,
	dsii.AMOUNT_ALLOC - nvl(fun_get_inventory_amount_alloc(dsii.hospital_id, dsii.store_id, dsii.stock_id), 0) AS amountAlloc,
	dsii.AMOUNT_STOP amountStop,
	dsii.PRICE_PURCHASE AS pricePurchase,
	dsii.PRICE_RETAIL AS priceRetail,
	dsii.MANUFACTURER_NAME AS manufacturerName,
	dsii.CSI_CODE AS csiCode,
	dsii.PRODUCER_NAME AS producerName,
	dsii.SUPPLIER_NAME AS supplierName,
	dsii.GOODS_NAME AS goodsName,
	dsii.MATERIEL_CATY AS materielCaty,
	dsii.GB_CODE AS gbCode,
	dsii.REGISTERED_CODE AS registeredCode,
	dsii.GOODS_CODE AS goodsCode,
	dsii.STORE_UNIT AS storeUnit, --重复的
	dsii.PHAR_UNIT AS pharUnit,  --重复的
	dsii.RETAIL_UNIT AS retailUnit,  --重复的
	nvl(dsii.MATERIEL_COMMON_NAME, dsii.GOODS_NAME) AS materielCommonName
FROM
	HIS_STOCK_INFO dsii

<think>好的,我现在需要解决用户提到的苍穹外卖day09项目中page.getTotal方法报错的问题。首先,我得了解这个问题的具体情况。用户在使用MyBatis-Plus的分页功能时,遇到page.getTotal报错,可能是空指针或者方法存在。 首先,我应该检查是否正确配置了MyBatis-Plus的分页插件。如果没有配置,分页查询的total字段可能无法正确获取,导致page.getTotal()返回null,从而在调用时出现空指针异常。正确的配置是在MyBatis的配置类中添加分页拦截器,比如: ```java @Configuration public class MybatisPlusConfig { @Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); interceptor.addInnerInterceptor(new PaginationInnerInterceptor()); return interceptor; } } ``` 如果配置没问题,接下来检查分页查询的代码是否正确。用户可能在使用Page对象时没有正确初始化或传递参数。例如,是否在Service层创建了Page对象,并传入了当前页和每页大小: ```java Page<Order> page = new Page<>(currentPage, pageSize); orderMapper.selectPage(page, queryWrapper); ``` 另外,检查是否导入了正确的Page类。有时候可能误导入其他包的同名类,比如com.baomidou.mybatisplus.extension.plugins.pagination.Page,而错误地使用了其他包中的Page类,这会导致方法存在或参数匹配。 还有,检查是否在Mapper接口的方法中正确使用了分页参数。如果Mapper方法没有返回Page类型,或者没有正确使用分页参数,也会导致total值无法获取。例如: ```java @Select("SELECT * FROM order ${ew.customSqlSegment}") Page<Order> selectOrderPage(Page<Order> page, @Param(Constants.WRAPPER) QueryWrapper<Order> queryWrapper); ``` 此外,数据库方言的配置也可能影响分页插件的正常工作。如果项目使用的是非默认的数据库(如PostgreSQL),需要在分页拦截器中指定方言: ```java interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.POSTGRE_SQL)); ``` 如果用户自定义了分页SQL,需要确保SQL语句正确,并且统计总数的语句有效。MyBatis-Plus会自动生成COUNT查询,但如果存在复杂查询,可能需要手动优化COUNT语句,或者在XML中定义。 最后,考虑依赖版本问题。检查pom.xml中MyBatis-Plus的版本是否过旧,建议使用较新的稳定版本,如3.4.0以上,避免已知的分页插件bug。 通过以上步骤逐步排查,应该能找到page.getTotal报错的原因并解决。如果用户能提供具体的错误信息或代码片段,可以更精准地定位问题。</think>### 苍穹外卖day09中`page.getTotal()`报错解决方案 #### 1. 检查MyBatis-Plus分页插件配置 配置分页插件会导致`total`字段无法统计。在MyBatis配置类中添加拦截器: ```java @Configuration public class MybatisPlusConfig { @Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); interceptor.addInnerInterceptor(new PaginationInnerInterceptor()); // 默认MySQL方言 return interceptor; } } ``` 若使用PostgreSQL数据库需指定方言: ```java new PaginationInnerInterceptor(DbType.POSTGRE_SQL) ``` #### 2. 验证分页查询代码规范 **错误示例**(导致total为null): ```java // 错误:将page对象传入Mapper查询 Page<Order> page = new Page<>(1,10); List<Order> list = orderMapper.selectList(queryWrapper); System.out.println(page.getTotal()); // 输出0 ``` **正确写法**: ```java Page<Order> page = new Page<>(currentPage, pageSize); orderMapper.selectPage(page, queryWrapper); // 关键:传入page对象 System.out.println(page.getTotal()); ``` #### 3. 检查Page对象导入路径 确认导入的是MyBatis-Plus的Page类: ```java import com.baomidou.mybatisplus.extension.plugins.pagination.Page; // ✅正确 // 错误:import org.springframework.data.domain.Page; ❌ ``` #### 4. 验证Mapper接口定义 Mapper接口需直接返回Page类型: ```java @Mapper public interface OrderMapper extends BaseMapper<Order> { // 自定义分页查询需显式声明返回类型 Page<Order> selectCustomPage(Page<Order> page, @Param("ew") QueryWrapper<Order> wrapper); } ``` #### 5. SQL日志分析 开启SQL日志查看是否执行COUNT查询: ```yaml # application.yml mybatis-plus: configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl ``` 正常日志应包含两条SQL: ```sql SELECT COUNT(*) FROM order WHERE ... # 总数查询 SELECT id,order_no,... FROM order WHERE ... LIMIT 10 # 数据查询 ``` #### 6. 版本兼容性检查 在`pom.xml`中确认使用稳定版本: ```xml <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.5.3.1</version> <!-- 2023年最新稳定版 --> </dependency> ``` #### 7. 特殊场景处理 **多表联查时**需要手动指定count语句: ```java @Select("SELECT o.*,u.name FROM order o LEFT JOIN user u ON o.user_id=u.id ${ew.customSqlSegment}") Page<OrderVO> selectOrderWithUser(Page<OrderVO> page, @Param(Constants.WRAPPER) QueryWrapper<OrderVO> wrapper); ``` **XML映射文件**中定义count语句: ```xml <select id="selectOrderWithUser" resultType="OrderVO"> SELECT o.*,u.name FROM order o LEFT JOIN user u ON o.user_id=u.id ${ew.customSqlSegment} </select> <select id="selectOrderWithUserCount" resultType="java.lang.Long"> SELECT COUNT(*) FROM order o ${ew.customSqlSegment} </select> ``` ### 典型错误场景排查表 | 现象 | 可能原因 | 解决方案 | |---------|-----------|-----------| | `java.lang.NullPointerException` | 调用`selectPage()`直接使用page对象 | 确保调用`mapper.selectPage(page,wrapper)` | | `getTotal() always returns 0` | 分页插件生效 | 检查配置类是否被Spring扫描 | | `No such method getTotal()` | 导错Page类 | 确认导入`com.baomidou.mybatisplus.extension.plugins.pagination.Page` | | 分页参数生效 | 方言配置错误 | 使用`PaginationInnerInterceptor(DbType.MYSQL)` | 通过上述步骤可解决95%以上的分页统计值异常问题。若仍存在问题,建议在Controller层打印`page.toString()`查看完整分页对象数据[^1]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值