mybatis 关联查询时,从表只返回第一条记录解决办法

如果两表联查,主表和明细表的主键都是id的话,明细表的多条只能查询出来第一条。

造成以上情况可能的原因:

  1、级联查询的时候,主表和从表有一样的字段名的时候,在mysql上命令查询是没问题的。但在mybatis中主从表需要为相同字段名设置别名。设置了别名就OK了。

例子:

主表Standard, 从表StandEntity,均有名为id的字段

 1 <resultMap id="StandardAndEntityResultMap" type="whu.edu.irlab.model.Standard" extends="BaseResultMap"> 2     <collection property="standEntities" ofType="whu.edu.irlab.model.StandEntity"> 3         (依据下面的select中更名的字段id别名se_id,在此将相同的字段名改为别名) 4         <id column="se_id" property="id" jdbcType="INTEGER" />  5         <result column="stand_id" property="standId" jdbcType="INTEGER" /> 6         <result column="stand_name" property="standName" jdbcType="VARCHAR" /> 7         <result column="entity_name" property="entityName" jdbcType="VARCHAR" /> 8     </collection> 9 </resultMap>10  11 <select id="findAllStandardAndEntity" resultMap="StandardAndEntityResultMap">12     select13     standard.*,14     standard_entity.id se_id,(在此将两表中相同的字段名id改为别名se_id,对应的上面collection部分也需要更改)15     standard_entity.stand_id,16     standard_entity.stand_name,17     standard_entity.entity_name18     from19       standard INNER JOIN standard_entity on standard.id = standard_entity.stand_id20 </select>

  2、一对多不能用Association,要用Collection。

  根据经验,使用association这个元素很容易出错,建议在resultMap中先换一种写法,不要用association。修改测试一下,如果成功的话,就基本可以去顶是association的问题了,之后查一下association详细资料,应该能解决。如果不是association的问题,就调查一下配置文件等等,总能够解决的。

  3、resultMap配置有问题

  bean代码如下:

 1 public class QueryVO { 2      3     private AppUser appuser; 4      5     private Tb tb; 6  7     public AppUser getAppuser() { 8         return appuser; 9     }10 11     public void setAppuser(AppUser appuser) {12         this.appuser = appuser;13     }14 15     public Tb getTb() {16         return tb;17     }18 19     public void setTb(Tb tb) {20         this.tb = tb;21     }22 }

mapper.xml配置:

 1     <select id="getItemsList" parameterType="QueryVO" resultMap="items"> 2         SELECT 3         xpro_sys_tb.*, 4         xpro_sys_app_user.* 5         FROM 6         xpro_sys_tb, 7         xpro_sys_app_user 8         WHERE xpro_sys_tb.author_id = 9         xpro_sys_app_user.USER_ID10         <include refid="query_items_where"></include>11     </select>12 13     <resultMap type="QueryVO" id="items">14         <association property="appuser" resultMap="appUser"></association>15         <association property="tb" resultMap="tb"></association>16     </resultMap>

以上代码导致的结果是查询出来的总是最后一条数据,类似后面数据覆盖了之前数据的现象。

发现问题的关键在于resultMap中如果不定义类似主键之类的能够区分每一条结果集的字段的话,会引起后面一条数据覆盖前面一条数据的现象。

最终将resultMap中添加id,并相应在bean中添加该字段,代码如下,问题解决。

 1 public class QueryVO { 2      3     private Integer id; 4      5     private AppUser appuser; 6      7     private Tb tb; 8  9     public AppUser getAppuser() {10         return appuser;11     }12 13     public void setAppuser(AppUser appuser) {14         this.appuser = appuser;15     }16 17     public Tb getTb() {18         return tb;19     }20 21     public void setTb(Tb tb) {22         this.tb = tb;23     }24 25     public Integer getId() {26         return id;27     }28 29     public void setId(Integer id) {30         this.id = id;31     }32     33     @Override34     public String toString() {35         return "QueryVO [id=" + id + ", appuser=" + appuser + ", tb=" + tb + "]";36     }37 }

mapper.xml代码:

 1     <select id="getItemsList" parameterType="QueryVO" resultMap="items"> 2         SELECT 3         xpro_sys_tb.*, 4         xpro_sys_app_user.* 5         FROM 6         xpro_sys_tb, 7         xpro_sys_app_user 8         WHERE xpro_sys_tb.author_id = 9         xpro_sys_app_user.USER_ID10         <include refid="query_items_where"></include>11     </select>12 13     <resultMap type="QueryVO" id="items">14         <id property="id" column="id"/>15         <association property="appuser" resultMap="appUser"></association>16         <association property="tb" resultMap="tb"></association>17     </resultMap>

原文地址:https://www.cnblogs.com/jpfss/p/9007195.html

时间: 2024-09-30 19:50:24

mybatis 关联查询时,从表只返回第一条记录解决办法的相关文章

CI codeigniter 查询 db query 返回 二维数组 返回 第一条记录

$r = $this->db->query("SELECT * FROM ych_borrow WHERE user_id=2"); $r->result_array();//返回二位数组 $r->row_array();//返回第一条数据的一维数组

MyBatis关联查询 (association) 时遇到的某些问题/mybatis映射

先说下问题产生的背景: 最近在做一个用到MyBatis的项目,其中有个业务涉及到关联查询,我是将两个查询分开来写的,即嵌套查询,个人感觉这样更方便重用: 关联的查询使用到了动态sql,在执行查询时就出现了如下错误:Caused by: org.apache.ibatis.reflection.ReflectionException: There is no getter for property named 'id' in 'class java.lang.Integer' 因为出现了这个问题,

mybatis关联查询问题(一对多、多对一)

mybatis 提供了高级的关联查询功能,可以很方便地将数据库获取的结果集映射到定义的Java Bean 中.下面通过一个实例,来展示一下Mybatis对于常见的一对多和多对一关系复杂映射是怎样处理的. 设计一个简单的博客系统,一个用户可以开多个博客,在博客中可以发表文章,允许发表评论,可以为文章加标签.博客系统主要有以下几张表构成: Author表:作者信息表,记录作者的信息,用户名和密码,邮箱等. Blog表   :  博客表,一个作者可以开多个博客,即Author和Blog的关系是一对多.

myBatis --关联查询

业务需求,需要查询到的结果集如下 结构分析 1.查询出所有的评论,即data[]里面是一个list 2.查出list中每个评论id(即userObjectCmmtId)下面所有的子评论,即一对多的关系. 实现方法如下 1.接口层文件如下 2.实现层文件如下 3.返回第一层bean如下 返回第二层bean 4.xml文件如下(第一层)    <resultMap type="com.zhiji.caren.VO.CmmtRel" id="cmmtListMap"

关于用Hibernate执行sql查询,字符字段类型只返回第一个字节的问题

关于用Hibernate执行sql查询,字符字段类型只返回第一个字节的问题 今天遇到了一个问题,就是在Hibernate中,我用sql去查询mysql数据库里面的user表里面的username字段,但是发现查出来的数据都是只有第一个字,例如:在user表里面的username字段中有一条数据是:"Chen chiwei",查询后返回的结果却是这条数据的第一个字母:"C":于是乎,我查了一下user这张表的设计,发现username这个字段的类型是'char'类型,

一对一关联查询时使用relation连贯操作查询后,调用getLastSql()方法输出的sql语句

如题: 一对一关联查询时使用relation连贯操作查询后,调用getLastSql()方法输出的sql语句不是一条关联查询语句. 例如: $list = $db->relation(true)->where($where)->order('blogid desc')->limit($Page->firstRow.','.$Page->listRows)->select(); $sql = $db->getLastSql(); 输出的sql语句为: SELE

用SQL server导出到oracle,查询时提示“表或视图不存在ORA-00942”错误

用SQL server2005的导出工具,将数据导出表到oracle,表名称里看到有这张表了,但查询或删除时都提示“ORA-00942表或者试图不存在”的错误,上网查了一下,是如下原因: “查询或删除名称存在的表时,却提示不存在,你看看在user_tables里这几个表名是小写吗? 那说明你建表的时候肯定带引号了,请select的时候也带上引号.例如:select * from "tableName",可以看出如果在SQLserver中,如果表名是小写的,那导入到oracle时,建表时

MyBatis关联查询,一对多关联查询

实体关系图,一个国家对应多个城市 一对多关联查询可用三种方式实现: 单步查询,利用collection标签为级联属性赋值: 分步查询: 利用association标签进行分步查询: 利用collection标签进行分步查询 单步查询 利用collection标签实现一对多单步关联查询: 指定进行关联查询的Java Bean字段,即collection标签的 property 属性: 指定集合中的Java Bean类型,即collection标签的 ofType属性: 实体类 public cla

Oracle-left join两表关联只取B表匹配到的第一条记录

背景:  A表.B表两表关联,关联出来的结果里B表有不止一条,需求是只要B表结果中的某一条(按某字段排序) 经过百度,发现 row_number() over(partition by a order by b desc)函数可用(需要说明下,order by 必须有缺少会报错),以下是数据环境及结果. 创建数据环境 create table A(ANAME varchar(20)); insert into A values('alan'); insert into A values('Ale