我想知道,我们如何在myBatis关联标记中传递多个列。
例如,我在一个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>
的{{1}}只有一列,property
我想传递2列,因此产生的代码,我们该怎么做?
我尝试了以下组合,没有效果:
course_id
但如果我通过单身, column =“{course_id}”或column =“course_id”
没有任何问题。
任何想法的人?
答案 0 :(得分:16)
您应该对复合键使用以下语法:
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>
我刚检查过它对我来说很好。 如果您有任何疑问,请随时提出。
答案 1 :(得分:0)
可以将多个列名称作为键值对传递
@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;
}