解决 org.springframework.jdbc.BadSqlGrammarException

文章讲述了在SpringBootTest中遇到BadSqlGrammarException,原因是MyBatis在分页查询时自动优化SQL,导致从表字段无法访问。解决办法是设置`setOptimizeCountSql(false)`关闭SQL优化。

解决 org.springframework.jdbc.BadSqlGrammarException

错误返回信息

 Execute SQLSELECT COUNT(*) FROM t_order AS o WHERE (age = 30)

org.springframework.jdbc.BadSqlGrammarException: 
### Error querying database.  Cause: java.sql.SQLSyntaxErrorException: Unknown column 'age' in 'where clause'
### The error may exist in file [D:\maven-workspace\SpringBootTest\target\classes\mapper\OrderMapper.xml]
### The error may involve defaultParameterMap
### The error occurred while setting parameters
### SQL: SELECT COUNT(*) FROM t_order AS o WHERE (age = ?)
### Cause: java.sql.SQLSyntaxErrorException: Unknown column 'age' in 'where clause'

根据返回的数据对比发现,我的sql语句发生了变化

这是我编写的sql语句

<select id="pageC" resultMap="BaseResultMap">
        select o.order_id,o.user_id,o.goods_name,o.goods_price,u.name,u.age,u.gender
        from t_order as o left join t_users as u on o.user_id = u.id 		          			${ew.customSqlSegment}
 </select>

这是我在测试方法编写的代码

@SpringBootTest
class SpringBootTestApplicationTests {


    @Autowired
    private OrderService orderService;

    @Test
    void contextLoads() {
        Page<OrderVo> page = new Page<>();
        page.setCurrent(1);
        page.setSize(10);

        LambdaQueryWrapper<OrderVo> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(OrderVo::getUserAge,30);

        IPage result = orderService.pageC(page,queryWrapper);
        System.out.println(result.getRecords());
       
    }
    
    //其他测试方法
}

解决方法

原因:默认情况下,当使用分页查询时,MyBatis会自动生成一个查询总数的SQL语句,以便获取总记录数。这个SQL语句会在原始查询语句的基础上进行优化,以提高性能。 所以在使用多表查询的时候,我们使用分页查询,Mybatis会优化代码,导致只会查询主表的数据,所以从表的字段无法被查询到。

解决方法

调用setOptimizeCountSql(false)方法, 告诉MyBatis不要进行优化,而是直接使用原始的查询总数的SQL语句。

@SpringBootTest
class SpringBootTestApplicationTests {

    @Autowired
    private OrderService orderService;

    @Test
    void contextLoads() {

        Page<OrderVo> page = new Page<>();
        page.setCurrent(1);
        page.setSize(10);

        //关闭sql优化,防止查询只查总表
        page.setOptimizeCountSql(false);

        LambdaQueryWrapper<OrderVo> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(OrderVo::getUserAge,30);

        IPage result = orderService.pageC(page,queryWrapper);
        System.out.println(result.getRecords());
    }
		//其他测试方法
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值