<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
mybatis裡查詢使用巢狀association標籤時,發現內層的association查詢的結果一直為null
那麼應該是mybatis沒有把資料對映到位了,經過排查是association中columnPrefix被不對應
<resultMap id="BaseResultMap" type="a.b.c.d.e"> <id column="id" property="id" /> <result property="workTime" column="work_time" /> <result property="model" column="model" /> <result property="status" column="status" /> <association property="interfaceUpstream" javaType="interfaceUpstream" columnPrefix="ui_"> <id column="id" property="id" /> <result property="interfaceName" column="interface_name" /> <result property="interfaceType" column="interface_type" /> <result property="frequency" column="frequency" /> <result property="address" column="address" /> <result property="templateOrSql" column="template_or_sql" /> <result property="status" column="status" /> <association property="systemInfo" javaType="SystemInfo" columnPrefix="sys_"> <id column="id" property="id"/> <result property="systemName" column="system_name"/> <result property="systemNameEN" column="system_name_en"/> <result property="belong" column="belong"/> <result property="status" column="status"/> </association> <association property="serverInfo" javaType="ServerInfo" columnPrefix="ser_"> <id column="id" property="id"/> <result property="ftpIp" column="ftp_ip"/> <result property="ftpPort" column="ftp_port"/> <result property="ftpAccount" column="ftp_account"/> <result property="ftpPassword" column="ftp_password"/> </association> </association> </resultMap>
<sql id="base_select"> SELECT ii.Id, ii.model, ii.status, ii.work_time, ui.id AS ui_id, ui.interface_name AS ui_interface_name, ui.interface_type AS ui_interface_type, ui.frequency AS ui_frequency, ui.address AS ui_address, ui.template_or_sql AS ui_template_or_sql, ui.status AS ui_status, sys.id AS sys_id, sys.system_name AS sys_system_name, sys.system_name_en AS sys_system_name_en, sys.belong AS sys_belong, sys.status AS sys_status, ser.id AS ser_id, ser.ftp_ip AS ser_ftp_ip, ser.ftp_port AS ser_ftp_port, ser.ftp_account AS ser_ftp_account, ser.ftp_password AS ser_ftp_password </sql>
原因是association在進行多層巢狀時,mybatis會將外層association的columnPrefix值與內層的進行併合,
如外層columnPrefix值位ui_, 內層為sys_, 那麼在SQL中就不能這樣 sys.id AS sys_id 了,需要將ui_字首加上,變成 sys.id AS ui_sys_id ,這樣mybatis在匹配的時候才會將資料對映到對應association上
SELECT ii.Id, ii.model, ii.status, ii.work_time, ui.id AS ui_id, ui.interface_name AS ui_interface_name, ui.interface_type AS ui_interface_type, ui.frequency AS ui_frequency, ui.address AS ui_address, ui.template_or_sql AS ui_template_or_sql, ui.status AS ui_status, sys.id AS ui_sys_id, sys.system_name AS ui_sys_system_name, sys.system_name_en AS ui_sys_system_name_en, sys.belong AS ui_sys_belong, sys.status AS ui_sys_status, ser.id AS ui_ser_id, ser.ftp_ip AS ui_ser_ftp_ip, ser.ftp_port AS ui_ser_ftp_port, ser.ftp_account AS ui_ser_ftp_account, ser.ftp_password AS ui_ser_ftp_password
問題解決!
學了一下mybatis的查詢返回值的集合巢狀,先查了查官網:
舉個例子三張表
hr_job_department
hr_job_position
第三張表裡在表示部門和職位的時候只用了上面兩張表的主鍵
但是查詢的時候,希望表示下面這樣的結果
所以返回值是不止一個物件,這樣就用到了集合巢狀
<resultMap id="userInfoMap" type="com.advancedc.hrsys.entity.UserInfo"> <id column="id" property="id" /> <result column="name" property="name" /> <result column="gender" property="gender" /> <result column="id_card" property="idCard" /> <result column="is_married" property="isMarried" /> <result column="phone" property="phone" /> <result column="priority" property="priority" /> <result column="entry_time" property="entryTime" /> <result column="full_time" property="fullTime" /> <result column="created_time" property="createdTime" /> <result column="edited_time" property="editedTime" /> <association property="jobDepartment" column="id" javaType="com.advancedc.hrsys.entity.JobDepartment"> <id column="jdid" property="id" /> <result column="jdname" property="name" /> </association> <association property="jobPosition" column="id" javaType="com.advancedc.hrsys.entity.JobPosition"> <id column="jpid" property="id" /> <result column="jpname" property="name" /> </association> </resultMap>
只需要知道:
(1)column表示資料庫欄位
(2)property表示Java裡的值
而且我這裡的主鍵都是id所以會出現重名的情況,在SQL語句裡,查詢時就要賦予別名才能加以區分,返回結果resultMap就如上圖所示
<select id="queryUserInfoBySomeone" resultMap="userInfoMap" resultType="com.advancedc.hrsys.entity.UserInfo"> SELECT ui.id, ui.name, ui.gender, ui.id_card, ui.is_married, ui.department_id, ui.position_id, ui.phone, ui.priority, ui.entry_time, ui.full_time, ui.created_time, ui.edited_time, jd.id jdid, jd.name jdname, jp.id jpid, jp.name jpname FROM hr_user_info ui INNER JOIN hr_job_department jd ON ui.department_id=jd.id INNER JOIN hr_job_position jp ON ui.position_id=jp.id <where> <if test="someone.id>0"> and ui.id = #{someone.id} </if> <if test="someone.gender!=null"> and ui.gender = #{someone.gender} </if> <if test="someone.name!=null"> and ui.name = #{someone.name} </if> <if test="someone.idCard!=null"> and ui.id_card = #{someone.idCard} </if> <if test="someone.isMarried!=null"> and ui.is_married = #{someone.isMarried} </if> <if test="someone.jobDepartment!=null and someone.jobDepartment.id!=null"> and ui.department_id = #{someone.jobDepartment.id} </if> <if test="someone.jobPosition!=null and someone.jobPosition.id!=null"> and ui.position_id = #{someone.jonPosition.id} </if> <if test="someone.phone!=null"> and ui.phone = #{someone.phone} </if> <if test="someone.entryTime!=null"> and ui.entry_time = #{someone.entryTime} </if> <if test="someone.fullTime!=null"> and ui.full_time = #{someone.fullTime} </if> </where> </select>
上圖用了INNER JOIN來查詢看上去挺簡潔的,有一種不簡潔的寫法如下,雖然也能得到結果,但是不知道效能對比如何
SELECT ui.id, ui.name, ui.gender, ui.id_card, ui.is_married, ui.department_id, ui.position_id, ui.phone, ui.priority, ui.entry_time, ui.full_time, ui.created_time, ui.edited_time, (select id jdid from hr_job_department jd where jd.id=ui.department_id) jdid, (select name jdname from hr_job_department jd where jd.id=ui.department_id) jdname, (select id jpid from hr_job_position jp where jp.id=ui.position_id) jpid, (select name jpname from hr_job_position jp where jp.id=ui.position_id) jpname FROM hr_user_info ui;
以上為個人經驗,希望能給大家一個參考,也希望大家多多支援it145.com。
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45