諸位請看一下這個場景,實體對象
public class QueryTestEntity { String name; Object obj; String userId; public String getName() { return name; } public void setName(String name) { this.name = name; } public Object getObj() { return obj; } public void setObj(Object obj) { this.obj = obj; } public String getUserId() { return userId; } public void setUserId(String userId) { this.userId = userId; } }
mybatis配置
<resultMap type="QueryTestEntity" id="QueryTestEntityMap1"> <result column="NAME" property="name" /> </resultMap> <resultMap type="QueryTestEntity" id="QueryTestEntityMap"> <result column="NAME" property="name" /> <association property="obj" resultMap="QueryTestEntityMap1" /> //這個關聯對象就是為了做一個例子,其他對象也會有這個現象 </resultMap>
查詢配置如下:
<select id="TestMap1" resultType="QueryTestEntity" parameterType="java.util.HashMap"> SELECT * FROM (SELECT PHONE_NUMBER NAME,USER_ID FROM test_table ORDER BY PHONE_NUMBER DESC ) </select> <select id="TestMap2" resultMap="QueryTestEntityMap" parameterType="java.util.HashMap"> SELECT * FROM (SELECT PHONE_NUMBER NAME,USER_ID FROM test_table ORDER BY PHONE_NUMBER DESC) </select>
執行結果為:
2016-06-20 18:30:25 [ main:3436 ] - [ DEBUG ] ==> Preparing: SELECT * FROM (SELECT PHONE_NUMBER NAME,USER_ID FROM test_table ORDER BY PHONE_NUMBER DESC ) 2016-06-20 18:30:25 [ main:3437 ] - [ DEBUG ] ==> Parameters: 2016-06-20 18:30:25 [ main:3619 ] - [ DEBUG ] <== Total: 40 result2:40 2016-06-20 18:30:25 [ main:3619 ] - [ DEBUG ] ==> Preparing: SELECT * FROM (SELECT PHONE_NUMBER NAME,USER_ID FROM test_table ORDER BY PHONE_NUMBER DESC) 2016-06-20 18:30:25 [ main:3619 ] - [ DEBUG ] ==> Parameters: 2016-06-20 18:30:26 [ main:3803 ] - [ DEBUG ] <== Total: 40 result3:3
數據說明:其中test_table表中的手機號為重復手機號(其中有三個是不同的),最主要想說的是查詢結果和映射的結果是不一致的。但是如果把映射修改為如下:
<resultMap type="QueryTestEntity" id="QueryTestEntityMap"> <result column="NAME" property="name" /> <result column="USER_ID" property="userId" />//新增USERID屬性,這個屬性唯一 <association property="obj" resultMap="QueryTestEntityMap1" /> //這個關聯對象就是為了做一個例子,其他對象也會有這個現象 </resultMap>
執行結果如下:
2016-06-20 18:50:26 [ main:3509 ] - [ DEBUG ] ==> Preparing: SELECT * FROM (SELECT PHONE_NUMBER NAME,USER_ID FROM test_table ORDER BY PHONE_NUMBER DESC) 2016-06-20 18:50:26 [ main:3510 ] - [ DEBUG ] ==> Parameters: 2016-06-20 18:50:27 [ main:3750 ] - [ DEBUG ] <== Total: 40 result3:40
實驗結論證明:
1、通過association對象映射對象,如果值相同會有一些問題,映射結果和查詢結果不一致(僅出現在resultMap這個對象上),個人認為這是一個bug,解決方案為映射結果上添加唯一屬性,即可。
2、沒使用association 功能的對象不會出現這個現象。
CREATE TABLE test_table ( phone_number VARCHAR2(100), USER_ID VARCHAR2(100) )
mybatis版本:mybatis-3.2.8