mybatis <collection>标签 类型为string时无法获取重复数据错误
1.场景:
fyq_share_house 表 和 fyq_sh_tag 表 两张表是一对多的关系, 一个楼盘对应多个标签,在实体类ShareHouse中使用
/**
* 楼盘标签
*/
private List<String> tags ;
来存放多个tag标签.
MyBatis对应的xml配置文件表示为
<collection property="tags" ofType="string">
<constructor>
<arg column="content"/>
</constructor>
</collection>
通过string 的构造函数来接收数据库查找的值,
但是这样有一个缺点,就是重复的数据无法获取到.
2.原因(自己通过看别人博客总结,没有看过源码,如果有不正确的地方,还请大佬指出)
mybatis在查找数据的时候是通过主键来区分不同的数据,通过sql查找的数据结果为

前面的id都是相同的,所以MyBatis会合并相同的content数据. 参考:https://blog.csdn.net/hello_xusir/article/details/53424257
3.解决
这里给出两种解决方案:
1.使用实体类
新建一个Tag类
public class Tag {
private Integer id;
private String content;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
}
通过
private List<Tag> tags ; MyBaits中:
<collection property="tags" ofType="java.fyq.domain.Tag" select="selectTags">
<id property="id" column="tagId"/>
<result property="content" column="content"/>
</collection>
传统方式,List<Tag> 类型为tag而不是String 来关联主键区分content内容.
2.新建另一个select语句
(注意: select 中的 #{id} 是column 中的id 的值,不管有几个#{},值都是 column的值,也就是sql语句中 SELECT sh.id 的值)
column 注 意 : 要 处 理 复 合 主 键 , 你 可 以 指 定 多 个 列 名 通 过 column= ” {prop1=col1,prop2=col2} ” 这种语法来传递给嵌套查询语 句。

<select id="selectTags" resultType="string">
SELECT content
FROM fyq_sh_tag
WHERE houseId = #{id}
</select>
<collection property="tags" column="id" ofType="string" select="selectTags"> </collection>
collection 标签中 的column属性设置为 新建的select语句中主键来区分content.
mybatis <collection>标签 类型为string时无法获取重复数据错误的更多相关文章
- MyBatis 传一个类型为String的参数时常见问题及解决方法
MyBatis要求如果参数为String的话,不管接口方法的形参是什么,在Mapper.xml中引用时需要改变为_parameter才能识别 : <select id="selectB ...
- 爬虫数据使用MongDB保存时自动过滤重复数据
本文转载自以下网站: 爬虫断了?一招搞定 MongoDB 重复数据 https://www.makcyun.top/web_scraping_withpython13.html 需要学习的地方: Mo ...
- mybatis collection标签和association标签(一对多,一对一)转载
mybatis 一对一与一对多collection和association的使用 在mybatis如何进行一对一.一对多的多表查询呢?这里用一个简单的例子说明. 一.一对一 1.associati ...
- Hibernate原生SQL映射MySQL的CHAR(n)类型到String时出错
今天在用Hibernate通过原生SQL和ResultTransformer映射时,出现数据类型不匹配的错误.但是通过Entity映射,没有问题.在网上找了好多答案,终于解决了. 核心代码: Stri ...
- MyBatis入参类型是List时判断非空
一.参数list时,先判断是否为空,否则会报错. 二.mybatis ${}与#{}的区别 简单来说#{} 解析的是占位符?可以防止SQL注入, 比如打印出来的语句 select * from tab ...
- 为啥final类型的map或者arraylist可以修改数据 而final类型的String变量不可以修改数据呢
比如 final Map map =new HashMap(); 可以往map里put数据final List list =new ArrayList(); 可以往list里 ...
- Delphi中返回类型为string的函数的一个陷阱(不是很懂)
如果类的一个成员函数的返回值是string类型,需要注意一个问题 其返回值可能是错误的 例如函数的实现如下 function GetString( s: string ): string;begin ...
- Distinct删除重复数据时 自定义的方法比较【转】
最近项目中在用Linq Distinct想要将重复的资料去除时,发现它跟Any之类的方法有点不太一样,不能很直觉的在呼叫时直接带入重复数据判断的处理逻辑,所以当我们要用某个成员属性做重复数据的判断时, ...
- Linq使用Distinct删除重复数据时如何指定所要依据的成员属性zz
最近项目中在用Linq Distinct想要将重复的资料去除时,发现它跟Any之类的方法有点不太一样,不能很直觉的在呼叫时直接带入重复数据判断的处理逻辑,所以当我们要用某个成员属性做重复数据的判断时, ...
随机推荐
- shell小计
NF 是每行的字段数 (NF==8)标识每行有8个字段,当前记录中的字段个数,就是有多少列NR 是总共读取了多少行 (NR==2)第二行的意思,已经读出的记录数,就是行号,从 1 开始 awk简单使 ...
- 2018.10.10 Java的The superclass "javax.servlet.http.HttpServlet" was not found on the Java Build Path 错误
我们在用Eclipse进行Java web开发时,可能会出现这样的错误:The superclass javax.servlet.http.HttpServlet was not found on t ...
- emmet工具使用和技巧
介绍 在前端开发的过程中,一大部分的工作是写 HTML.CSS 代码.特别是手动编写 HTML 代码的时候,效率会特别低下,因为需要敲打很多尖括号,而且很多标签都需要闭合标签等.于是,就有了 Emme ...
- Android学习笔记_41_TabHost自定义标签和TraceView性能测试
一.tabhost第一种用法,通过在帧布局放入定义好的page页面来实现,这样导致在当前activity下代码量比较大. 1.页面布局: | | | | ...
- webstorm开发nodejs的技巧--代码提示DefinitelyTyped
先发视频“WebStorm - MEAN Stack Walkthrough and Tips”,地址:http://www.tudou.com/programs/view/txhBUA7fcNA/? ...
- requireJs sass侧边栏
koala 下载 将sass编译为css文件 1 嵌套 2 $变量 3 @mixin 函数名(参数) 4 @include 函数 调用 5 @import "xxx" 引 ...
- jdk下载安装
1.下载地址:https://www.oracle.com 注册,登陆,选择版本下载(注意,下载时提示you must accept the license agreement before down ...
- 冒泡排序_C语言_数组
冒泡排序_C语言_数组 #include <stdio.h> //冒泡排序 小->大 void sort(int * pArray, int len); int main(int a ...
- 请对比 Exception 和 Error,另外,运行时异常与一般异常有什么区别?
error指的是不可预料的错误,可能会导致程序宕机:而exception指的是在程序运行中可以预见的异常,而异常分为检查异常与一般异常,检查异常需要在程序中显示捕获并处理,一般异常可以通过程序编码来进 ...
- JS基础——浅谈前端页面渲染和性能优化
加载html中的静态资源 其中,加载静态资源的过程,一般为浏览器根据DNS服务器得到域名的IP地址,然后向这个IP的机器发送http请求,服务器收到.处理并返回http请求,浏览器得到返回http请求 ...