1. 程式人生 > >【問題解決】Mybatis一對多/多對多查詢時只查出了一條資料

【問題解決】Mybatis一對多/多對多查詢時只查出了一條資料

問題描述:
如果三表(包括了關係表)級聯查詢,主表和明細表的主鍵都是id的話,明細表的多條資料只能查詢出來第一條/最後一條資料。

三個表,許可權表(Permission),許可權組表(PermissionGroup),許可權組與許可權的關係表(PermissionPermissionGroupKey)

實體類就不寫上來了。

原出錯對映檔案:

  <resultMap id="permissionGroupResultMap" type="cn.kx59.admin.entity.PermissionGroup" >
    <id column
="id" property="id" jdbcType="INTEGER" />
<result column="name" property="name" jdbcType="VARCHAR" /> <result column="decipher" property="decipher" jdbcType="VARCHAR" /> <result column="create_time" property="createTime" jdbcType="TIMESTAMP" /> <!-- 一個許可權組 對應多個許可權-->
<collection property="permissionArrayList" ofType="cn.kx59.admin.entity.Permission"> <id column="id" property="id" jdbcType="INTEGER" /> <result column="url" property="url" jdbcType="VARCHAR" /> <result column="name" property="name" jdbcType="VARCHAR" /> <result
column="explain" property="explain" jdbcType="VARCHAR" />
<result column="decipher" property="decipher" jdbcType="VARCHAR" /> <result column="create_time" property="createTime" jdbcType="TIMESTAMP" /> </collection> </resultMap> <!--查詢所有的許可權組以及許可權組包含的許可權--> <select id="selectAllPermissionGroupAndPermission" resultMap="permissionGroupResultMap" > SELECT * FROM [QPWebDB].[dbo].[permission_group] pg left join [QPWebDB].[dbo].[permission_permission_group] ppg on pg.id=ppg.permission_group_id left join [QPWebDB].[dbo].[permission] p on p.permission_id=ppg.permission_id </select>

這是因為主表和明細表的id欄位名相同造成的。
問題的關鍵在於resultMap中如果不定義類似主鍵之類的能夠區分每一條結果集的欄位的話,會引起後面一條資料覆蓋前面一條資料的現象。

解決方法一:
修改主表或者明細表的id名,保證不一致就行

解決方法二:
查詢結果起別名
修改對映檔案如下:

  <resultMap id="permissionGroupResultMap" type="cn.kx59.admin.entity.PermissionGroup" >
    <id column="id" property="id" jdbcType="INTEGER" />
    <result column="name" property="name" jdbcType="VARCHAR" />
    <result column="decipher" property="decipher" jdbcType="VARCHAR" />
    <result column="create_time" property="createTime" jdbcType="TIMESTAMP" />
    <!-- 一個許可權組 對應多個許可權-->
    <collection property="permissionArrayList" ofType="cn.kx59.admin.entity.Permission">
      <id column="p_id" property="id" jdbcType="INTEGER" />
      <result column="url" property="url" jdbcType="VARCHAR" />
      <result column="name" property="name" jdbcType="VARCHAR" />
      <result column="explain" property="explain" jdbcType="VARCHAR" />
      <result column="decipher" property="decipher" jdbcType="VARCHAR" />
      <result column="create_time" property="createTime" jdbcType="TIMESTAMP" />
    </collection>
  </resultMap>

  <!--查詢所有的許可權組以及許可權組包含的許可權-->
  <select id="selectAllPermissionGroupAndPermission" resultMap="permissionGroupResultMap" >
        SELECT pg.*,
  p.id p_id,
  p.url,
  p.name,
  p.explain,
  p.decipher,
  p.create_time
  FROM [QPWebDB].[dbo].[permission_group] pg
  left join [QPWebDB].[dbo].[permission_permission_group] ppg on pg.id=ppg.permission_group_id
  left join [QPWebDB].[dbo].[permission] p on p.id=ppg.permission_id
  </select>

如上兩種方法均能解決這個問題,希望對你有幫助
有知道出現這個問題的原理的大佬歡迎在評論區解釋下,O(∩_∩)O謝謝

本文章由[諳憶]編寫, 所有權利保留。
歡迎轉載,分享是進步的源泉。