mybatis查询数据为空

在使用Mybatis进行数据查询时,遇到查询接口返回数据为空的状况。检查代码无误,尝试在mapper.xml中使用concat拼接字符串,但查询结果依然为0。最终发现是由于在查询条件中,skuName的value值包含双引号导致的。解决问题的方法是去掉双引号。此外,注意Controller层请求,当前端参数通过response body传递时,@ModelAttribute需改为@RequestBody。

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

使用postman测试一个查询接口,数据为空。

查询的代码,没有问题。

public List<Long> getByLikeName(String name) {
    return skuDao.getByLikeName("%" + name + "%");

}
<!-- sku模糊名字编码编号查询-->
<select id="getByLikeName" parameterType="java.lang.String" resultType="Long">
    SELECT s.id
    FROM sku s
    WHERE s.sku_name LIKE #{name} OR s.sku_code LIKE #{name} OR s.bar_code LIKE #{name} AND deleted = '0'
</select>

 

明明有数据,为什么查询出来的结果为空呢?后来改了一下查询方式,在mapper.xml中使用concat拼接字符串。

public List<Long> getByLikeName(String name) {
    return skuDao.getByLikeName(name);

} 

<!-- sku模糊名字编码编号查询-->
    <select id="getByLikeName" parameterType="java.lang.String" resultType="Long">
        SELECT s.id
        FROM sku s
        WHERE deleted = 0 AND
        (s.sku_name LIKE concat('%', #{name,jdbcType=VARCHAR}, '%')
        OR s.sku_code LIKE concat('%', #{name,jdbcType=VARCHAR}, '%')
        OR s.bar_code LIKE concat('%', #{name,jdbcType=VARCHAR}, '%'))
    </select>

 可以看到,筛选出的数据仍然是0.

Preparing: SELECT s.id FROM sku s WHERE deleted = 0 AND (s.sku_name LIKE concat('%', ?, '%') OR s.sku_code LIKE concat('%', ?, '%') OR s.bar_code LIKE concat('%', ?, '%'))  
2019-06-27 16:54:44 [http-nio-8003-exec-1] DEBUG c.r.s.o.m.S.getByLikeName - ==> Parameters: "铅笔"(String), "铅笔"(String), "铅笔"(String) 
2019-06-27 16:54:44 [http-nio-8003-exec-1] DEBUG c.r.s.o.m.S.getByLikeName - <==      Total: 0 



 

最后解决方式:

修改skuName的value值,改成铅笔,不要加双引号,就可以了。

 

==>  Preparing: SELECT s.id FROM sku s WHERE deleted = 0 AND (s.sku_name LIKE concat('%', ?, '%') OR s.sku_code LIKE concat('%', ?, '%') OR s.bar_code LIKE concat('%', ?, '%'))  
2019-06-27 16:51:48 [http-nio-8003-exec-3] DEBUG c.r.s.o.m.S.getByLikeName - ==> Parameters: 铅笔(String), 铅笔(String), 铅笔(String) 
2019-06-27 16:51:48 [http-nio-8003-exec-3] DEBUG c.r.s.o.m.S.getByLikeName - <==      Total: 17 

 

 

总结:

//参数不加双引号
Preparing: SELECT s.id FROM sku s WHERE s.sku_name LIKE ? OR s.sku_code LIKE ? OR s.bar_code LIKE ? AND deleted = '0'  
2019-06-27 17:04:56 [http-nio-8003-exec-2] DEBUG c.r.s.o.m.S.getByLikeName - ==> Parameters: %铅笔%(String), %铅笔%(String), %铅笔%(String) 
2019-06-27 17:04:56 [http-nio-8003-exec-2] DEBUG c.r.s.o.m.S.getByLikeName - <==      Total: 17  


//参数加双引号
Preparing: SELECT s.id FROM sku s WHERE s.sku_name LIKE ? OR s.sku_code LIKE ? OR s.bar_code LIKE ? AND deleted = '0'  
2019-06-27 17:09:06 [http-nio-8003-exec-1] DEBUG c.r.s.o.m.S.getByLikeName - ==> Parameters: %"铅笔"%(String), %"铅笔"%(String), %"铅笔"%(String) 

双引号也是字符啊,想想也是这个道理,这么简单,搞了好久。

注意controller层请求:

@PostMapping("queryList")
public BaseResultVo queryList(@ModelAttribute WarehouseInventoryReportDTO dto);

这里使用的是@ModelAttribute,postman参数放在params里,即跟在url后面。

如果前端请求把参数放在了response body中传过来,@ModelAttribute需要改成@RequestBody。

 

### MyBatis 查询字段的解决方案 当遇到MyBatis查询时部分字段返回为的问题,通常有几种常见原因和对应的解决方案。 #### 配置驼峰命名转换 一种常见的原因是数据库表中的列名使用了下划线风格而实体类属性采用的是驼峰命名法。这可能导致映射不匹配从而使得某些字段未能正确填充进而显示为`null`。为此,在Spring Boot项目中可以通过设置`application.properties`来启用自动转换功能: ```properties mybatis.configuration.map-underscore-to-camel-case=true ``` 此配置项会告知框架将带有下划线分隔符的结果集名称转化为JavaBean遵循的标准形式[^3]。 对于非Spring环境下的应用,则可以在XML配置文件里指定相同的行为模式: ```xml <configuration> <settings> <!-- 开启驼峰命名支持 --> <setting name="mapUnderscoreToCamelCase" value="true"/> </settings> </configuration> ``` 上述更改有助于改善因命名习惯差异所引起的赋值失败状况[^4]。 #### 处理NULL值情况 除了考虑名字对应关系外,还需注意实际存储于DBMS里的数据本身是否存在缺失或被设为了SQL NULL。针对这种情况,可以利用自定义ResultMap实现更精细控制,比如设定默认初始化表达式或是提供替代文本给定型化处理后的对象成员变量;另外就是调整Mapper接口签名使之接受额外参数用于指示哪些地方允许存在白状态以及如何应对它们[^2]。 #### 使用注解优化映射逻辑 最后值得一提的是,借助诸如`@Results`, `@ResultType`之类的元数据标签同样能够帮助我们更好地管理复杂场景下的关联规则,特别是面对多表联结查询或者嵌套结构体实例化需求之时显得尤为重要。不过就单纯解决指针异常而言可能并不需要如此复杂的手段除非业务模型确实非常特殊[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值