12

myBatis 関連付けタグで複数の列を渡す方法を知りたいです。

たとえば、1 つの mapper.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>

ご覧のとおり、<association>withpropertyサブスクリプションには列が 1 つしかありません。course_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 

ただし、単一を渡すと、column="{course_id}" または column="course_id"

問題なく動作します。

アイデアはありますか?

4

2 に答える 2

23

複合キーには次の構文を使用する必要があります。

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

prop1, prop2関連付けられたクエリのパラメーターはどこにあり、col1, col2そのクエリに渡される SQL 列はどこにありますか。

あなたの場合:

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>

私はちょうどそれが私のためにうまくいったことを確認しました。ご不明な点がございましたら、お気軽にお問い合わせください。

于 2013-06-19T17:22:32.513 に答える
1

複数の列名をキーと値のペアとして渡すことができます

@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;
  }
于 2016-06-08T05:28:42.433 に答える