解决 org.springframework.jdbc.BadSqlGrammarException
错误返回信息
Execute SQL:SELECT 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());
}
//其他测试方法
}