简体   繁体   中英

Passing multiple columns in myBatis <assoctiation>

I want to know, how do we pass multiple columns in a myBatis association tag.

For example, I have the following xml snippet in one my mapper.xml file:

<resultMap type="com.mysite.domain.CourseBuilderCourses" id="ResultMapWithAssmnts" extends="BaseResultMap">

    <association property="totalAssignmentCnt" column="course_id" select="selectTotalAssgnmentsCnt"/>
    <association property="totalAssessmentCnt" column="course_id" select="selectTotalAssesmentsCnt"/>  
<!--  see this association >> --> <association property="subscription" column="course_id" select="com.mysite.persistence.mybatis.CourseSubscriptionMapper.selectByUsercId"/> 

  </resultMap>

As you can see, the <association> with property subscription has only one column, course_id

I want to pass 2 columns to it, and therefore the resultant code, how do we do that?

I tried the following combinations, none worked:

column="{course_id,user_id}"   // null,null are passed as parameters 
column="course_id,user_id"   // null,null are passed as parameters 
column="{COURSE_ID=course_id,USER_ID=user_id}"   // null,null are passed as parameters 

but if I pass single, column="{course_id}" or column="course_id"

works without any issues.

Any idea guys?

You should use the following syntax for composite keys:

column="{prop1=col1,prop2=col2}".

Where prop1, prop2 are parameters of the associated query and col1, col2 are sql columns passed to that query.

In your case:

CourseMapper.xml :

column="{courseId=id,userId=user_id}" 
...
select id, user_id, ... from course ...

CourseSubscriptionMapper.xml :

<select id="selectByUsercId" ...>
    select ... where course_id=#{courseId} and user_id=#{userId}
</select>

I just checked it worked fine for me. If you have any questions, please feel free to ask.

Multiple column names can be passed as key value pairs

@Results(value = { @Result(property = "CourseSubscription", column = "{courseId=id,userId=user_id}

For more info, you can refer the

org.apache.ibatis.builder.MapperBuilderAssistant.parseCompositeColumnName(String).columnName -- API which parses the meta-data of @Result.column()

private List<ResultMapping> parseCompositeColumnName(String columnName) {
    List<ResultMapping> composites = new ArrayList<ResultMapping>();
    if (columnName != null && (columnName.indexOf('=') > -1 || columnName.indexOf(',') > -1)) {
      StringTokenizer parser = new StringTokenizer(columnName, "{}=, ", false);
      while (parser.hasMoreTokens()) {
        String property = parser.nextToken();
        String column = parser.nextToken();
        ResultMapping.Builder complexBuilder = new ResultMapping.Builder(configuration, property, column, configuration.getTypeHandlerRegistry().getUnknownTypeHandler());
        composites.add(complexBuilder.build());
      }
    }
    return composites;
  }

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM