2012-10-26 1 views
3

mybatis 매핑을 사용하여 다른 모음의 개체에 대한 모음을 설정해야합니다.Mybatis 중첩 컬렉션이 열 접두사로 올바르게 작동하지 않습니다.

나를 위해 columnPrefix를 사용하여 승/작동하지만 많은 반복 가능한 열이 있기 때문에 필요합니다. 모두가 잘 작동 columnPrefix으로

 <resultMap id="ParentMap" type="org.example.mybatis.Parent"> 
     <id column="Id" jdbcType="VARCHAR" property="id" /> 
     <result column="Name" jdbcType="VARCHAR" property="name" /> 
     <result column="SurName" jdbcType="VARCHAR" property="surName" /> 

     <collection property="childs" 
     javaType="ArrayList" ofType="org.example.mybatis.Child" 
     resultMap="ChildMap" columnPrefix="c_"/>  
    </resultMap> 

<resultMap id="ChildMap" type="org.example.mybatis.Parent"> 
    <id column="Id" jdbcType="VARCHAR" property="id" /> 
    <result column="ParentId" jdbcType="VARCHAR" property="parentId" /> 
    <result column="Name" jdbcType="VARCHAR" property="name" /> 
    <result column="SurName" jdbcType="VARCHAR" property="surName" /> 
    <result column="Age" jdbcType="INTEGER" property="age" /> 

    <collection property="toys" 
     javaType="ArrayList" ofType="org.example.mybatis.Toy" 
     resultMap="ToyMap" columnPrefix="t_"/> 
</resultMap> 

<resultMap id="ToyMap" type="org.example.mybatis.Toy"> 
    <id column="Id" jdbcType="VARCHAR" property="id" /> 
    <result column="ChildId" jdbcType="VARCHAR" property="childId" /> 
    <result column="Name" jdbcType="VARCHAR" property="name" /> 
    <result column="Color" jdbcType="VARCHAR" property="color" /> 
</resultMap> 

<sql id="Parent_Column_List"> 
    p.Id, p.Name, p.SurName, 
</sql> 

<sql id="Child_Column_List"> 
    c.Id as c_Id, c.ParentId as c_ParentId, c.Name as c_Name, c.SurName as c_Surname, c.Age as c_Age, 
</sql> 

<sql id="Toy_Column_List"> 
    t.Id as t_Id, t.Name as t_Name, t.Color as t_Color 
</sql> 

<select id="getParent" parameterType="java.lang.String" resultMap="ParentMap" > 
    select 
    <include refid="Parent_Column_List"/> 
    <include refid="Child_Column_List" /> 
    <include refid="Toy_Column_List" /> 
    from Parent p 

    left outer join Child c on p.Id = c.ParentId 
    left outer join Toy t on c.Id = t.ChildId 
    where p.id = #{id,jdbcType=VARCHAR} 

하지만, 중첩 된 장난감 컬렉션이 비어 있습니다. 데이터베이스의 Sql 쿼리가 올바르게 작동하고 모든 장난감이 결합됩니다.

내가 놓친 것이 있거나 이것이 mybatis의 버그입니까?

+0

은, 몰라하지만 왜 모든 열은이 아닌 ""입니다.? – cporte

+0

작은 실수, 관련이 없음 –

+0

좋은 질문 나에게도 같은 문제가있어서 내 방식으로이 해결책을 찾았습니다. 확인해주십시오 –

답변

6

나는 당신과 같은 문제가있었습니다. null을 반환하는 이유는 ChildMap에 열 접두사 'c_'가 있고 ToyMap의 접두사가 't_'이지만 ChildMap에 컬렉션 속성에 따라 ToyMap이 포함되어 있기 때문입니다. 따라서 실제로이 경우 Toy 테이블의 모든 열에 접두어 'c_t_'가 있어야합니다.

<sql id="Toy_Column_List"> 
    t.Id as c_t_Id, t.Name as c_t_Name, t.Color as c_t_Color 
</sql> 
0

이이 내 쿼리입니다

<resultMap id="categoryPreferenceValueMap" type="SyncCategoryPreferenceValueModel"> 

     <id property="preferenceTypeId" column="preference_type_id" /> 
     <result property="title" column="title"/> 
     <result property="index" column="type_index"/> 
      <result property="updatedAt" column="category_updated_at" /> 


      <collection property="preferences" column="p_preference_id" ofType="SyncPreferenceModel" > 
      <id property="preferenceId" column="p_preference_id" /> 
      <result property="title" column="p_preference_title" /> 
      <result property="index" column="preference_index" /> 
      <result property="updatedAt" column="preference_updated_at" /> 


      <collection property="preferenceValues" column="p_v_preference_value_id" ofType="SyncPreferenceValueModel" > 
       <id property="preferenceValueId" column="p_v_preference_value_id" /> 
       <result property="preferenceValue" column="p_v_preference_value" /> 
       <result property="updatedAt" column="preference_value_updated_at" /> 

      </collection> 
     </collection> 
    </resultMap> 

내 작업 예입니다

<select id="getPrefersenceWithValues" resultMap="categoryPreferenceValueMap"> 
    SELECT 
     PT.preference_type_id, PT.title, PT.type_index,PT.updated_at as category_updated_at, 
     P.preference_id as p_preference_id , P.title as p_preference_title ,P.index as preference_index, 

     P.updated_at as preference_updated_at, 

     PV.preference_value_id as p_v_preference_value_id ,PV.preference_value as p_v_preference_value 

    FROM preference_types PT 
    INNER JOIN preferences P ON PT.preference_type_id=P.preference_type_id 
     INNER JOIN preference_values PV ON P.preference_id=PV.preference_id 

    ORDER BY type_index 

</select> 

및 OUT 넣어이다

[ 
    { 
     "preferenceTypeId": "1", 
     "title": "abc BASICS", 
     "index": "1", 
     "updatedAt": 1, 
     "preferences": [ 
     { 
      "preferenceId": "1", 
      "title": "xyz xyz", 
      "preferenceTypeId": null, 
      "gender": null, 
      "index": 1, 
      "updatedAt": 1, 
      "preferenceValues": [ 
      { 
       "preferenceId": null, 
       "preferenceValueId": "2", 
       "preferenceValue": "30-60", 
       "gender": null, 
       "updatedAt": 0 
      }, 
      { 
       "preferenceId": null, 
       "preferenceValueId": "1", 
       "preferenceValue": "0-30", 
       "gender": null, 
       "updatedAt": 0 
      } 
      ] 
     } 
     ] 
    } 
    ] 
이 관련이있는 경우