在 myBatis 中传递多个列<关联>

2022-09-04 07:50:10

我想知道,我们如何在myBatis关联标签中传递多个列。

例如,我在一个映射器.xml文件中具有以下 xml 代码段:

<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>

如您所见,with 订阅只有一列,<association>propertycourse_id

我想向它传递2列,因此是生成的代码,我们该怎么做?

我尝试了以下组合,但没有一个有效:

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 

但是如果我传递单个,列=“{course_id}”或列=“course_id”

工作没有任何问题。

伙计们,有什么想法吗?


答案 1

应对复合键使用以下语法:

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

其中,关联查询的参数以及传递给该查询的 sql 列。prop1, prop2col1, col2

在您的情况下:

课程映射器.xml

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

课程订阅映射器.xml

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

我刚刚检查了它对我的工作正常。如果您有任何疑问,请随时提问。


答案 2

多个列名可以作为键值对传递

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

有关详细信息,您可以参考

org.apache.ibatis.builder.MapperBuilderAssistant.parseCompositeColumnName(String).columnName -- 解析@Result.column() 元数据的 API

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;
  }

推荐