MyBatis查询数据,赋值给List集合时,数据缺少的问题及解决
作者:咖啡苦涩 发布时间:2021-07-05 23:25:00
MyBatis查询数据赋值给List集合数据缺少
今天在使用MyBatis查询数据时,发现查出来的数据和List集合的大小不一致,如下图所示,Total为3,但是list集合size为2.
List<ArticleCommentToShow> commentsByArticleId = articleCommentService.getCommentsByArticleId(article.getArticleId());
logger.info("长度:" + commentsByArticleId.size());
/**
* 评论用户头像
*/
private String imagePath;
/**
* 评论用户的用户名
*/
private String userName;
/**
* 评论实体类
*/
private ArticleComment articleComment;
ArticleCommentShow中包含了一个实体类ArticleComment,在查询的时候我使用了resultMap查询,对应的查询如下图所示
<!--对应于getCommentsByArticleId的需要字段-->
<sql id="wholeCommon">
user_name,image_path,article_comment_id,comment_content, comment_time, to_id,article_comment.user_id,article_comment.article_id,to_user_id
</sql>
<!--根据文章ID获取评论-->
<select id="getCommentsByArticleId" resultMap="CommentsResult">
select
<include refid="wholeCommon"/>
from article_comment,user
<where>
(article_id = #{articleId} and article_comment.user_id = user.user_id)
</where>
</select>
<resultMap id="CommentsResult" type="com.molihub.entity.ArticleCommentToShow">
<result property="userName" column="user_name"/>
<result property="imagePath" column="image_path"/>
<association property="articleComment" javaType="com.molihub.entity.ArticleComment">
<id property="articleCommentId" column="article_comment_id"/>
<result property="articleId" column="article_id"/>
<result property="commentContent" column="comment_content"/>
<result property="commentTime" column="comment_time"/>
<result property="toId" column="to_id"/>
<result property="userId" column="user_id"/>
<result property="toUserId" column="to_user_id"/>
</association>
</resultMap>
经过不断的百度,查资料,发现是因为我的查出来的数据没有主键,因为我查出来的数据格式类似这样:list: [1,a],[2,a],[3,b],这里的字母为实体类,所以当实体类重复的时候,MyBatis会自动去重,用最新的数据替换之前“重复”的数据。
解决办法
1.添加主键,用于区分重复数据,2.禁用二级缓存,否则虽然第一次查出来的数据是正常的,但是再次查询的时候会发现数据依然缺少。
经过修改,resultMap改为如下格式
<resultMap id="CommentsResult" type="com.molihub.entity.ArticleCommentToShow">
<id property="articleComment.articleCommentId" column="article_comment_id"/>
<result property="userName" column="user_name"/>
<result property="imagePath" column="image_path"/>
<result property="articleComment.articleId" column="article_id"/>
<result property="articleComment.commentContent" column="comment_content"/>
<result property="articleComment.commentTime" column="comment_time"/>
<result property="articleComment.toId" column="to_id"/>
<result property="articleComment.userId" column="user_id"/>
<result property="articleComment.toUserId" column="to_user_id"/>
</resultMap>
Mybatis查询时数据丢失的问题
公司里的实体类和mapper文件均由mybatis逆向工程生成
之前使用myabtis查询时直接使用注解@select(......)时遇到了一个问题。
结果显示数据库查询没有问题,但是有的数据缺没有插入到指定的字段中,如下图中ID成功存储,Z40_ID,Z40_103到Z40_113均失败。
经过排查得出结论
如果数据库命名很规范比如user_name,用逆向插件生成实体类时该字段会自动转换为userName
但是如果数据库命名形式为:字母(含数字)_字母(含数字)这种情况,自动映射就会失效,就会发生部分数据没有set到指定属性下;
解决办法
对于一些命名不规范的列需要加上注解手动映射
或者直接在mapper.xml文件里用xml方式写sql语句,一般逆向工程都自动生成列的映射规范了;
来源:https://blog.csdn.net/qq_31063727/article/details/104334141


猜你喜欢
- W3C制定了XML DOM标准。很多编程语言中多提供了支持W3C XML DOM标准的API。我在之前的文章中介绍过如何使用Javascri
- 这篇文章主要介绍了JavaWeb如何实现禁用浏览器缓存,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋
- 对象的初始化和清理生活中我们买的电子产品都基本会有出厂设置,在某一天我们不用时候也会删除一些自己信息数据保证安全。C++中的面向对象来源于生
- Eclipse的应用需要众多的插件,但是Eclipse的插件大家又知道多少呢?“Eclipse最牛的30个插件”不知道看官们是否了解,51C
- 桶排序桶排序是计数排序的升级,计数排序可以看成每个桶只存储相同元素,而桶排序每个桶存储一定范围的元素,通过函数的某种映射关系,将待排序数组中
- 1、找奇数:public static boolean isOdd(int i){ return i % 2 == 1; }上面的方法真
- public void PrintPercentage(int FinishedCount, int TotalCount) {
- Windows操作系统可以实现重命名文件操作,却不能实现批量重命名。本实例实现了批量重命名功能,可以将一个文件夹内同一类型的文件按照一定的规
- JAVA接口的概念官方解释:Java接口是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不
- 生成唯一值的方法很多,下面就不同环境下生成的唯一标识方法一一介绍,作为工作中的一次总结,有兴趣的可以自行测试:一、在 .NET 中生成1、直
- 引言综合应用Java的GUI编程和网络编程,实现一个能够支持多组用户同时使用的聊天室软件。该聊天室具有比较友好的GUI界面,并使用C/S模式
- 静态代理: 由我们开发者自己手动创建或者在程序运行前就已经存在的代理类,静态代理通常只代理一个类, * 是代理一个接口下的多个实现类。动态
- 这篇博客主要介绍的是 Android 主流各种机型和各种版本的悬浮窗权限适配,但是由于碎片化的问题,所以在适配方面也无法做到完全的主流机型适
- Java 的表格表格是一个由多行,多列组成的二维显示区。Swing的JTable以及相关类提供了对这种表格的支持,程序既可以使用简单的代码创
- 一、函数式接口概念函数式接口在Java中是指:有且仅有一个抽象方法的接口。 当然接口中可以包含其他的方法(默认,静态,私有)函数式接口,即适
- 目录介绍需求来源传统算法问题新算法特点性能数据效果“我”是什么适用范围能用多久★★集成建议★★常规集成大型分布式集成配置变更代码示例运行环境
- 在 fluro 中,定义路由处理器 Handler 时可以指定该页面的默认转场形式,或者在使用 navigateTo 方法是可以设置页面跳转
- 1)下载sqlite jdbc驱动http://www.xerial.org/maven/repository/artifact/org/x
- 目录前言Hello World1.可以在 Spring Initializr上面添加,也可以手动在 pom.xml中添加如下代码∶2. 编写
- 首先,看一下效果 可能各位在别处看到过类似的东西,我在微信的文章末尾看到有个玩意,感觉有意思,就用代码实现一下。这篇文章主要把握