如何从MyBatis中的@Result将参数传递给@One

时间:2014-05-14 21:52:12

标签: java mybatis

我正在处理时态版本化数据,因此我的大多数查询都需要时间点和组ID。如何将这些传递给我的嵌套多对一查询?

例如:

@Select("select * "
        + "from type1 "
        + "where effective_date <= #{0, typeHandler=...} "
        + "and termination_date > #{0, typeHandler=...}")
@Results({
    @Result(property = "id", column = "id"),
    @Result(property = "groupId", column = "group_id"),
    // ...
    @Result(property = "type2", column = "type2_group_id", javaType = Type2.class,
        one = @One(select = "com...mapper.Type2Mapper.getByGroupId")) // **
    // ...
})

这样Type2Mapper有:

@Select(...)
Type2 getByGroupId(Date date, Long groupId);

// **标识的行必须同时传递传入其中的Date以及type2_group_id。很显然,我可以重新安排事情或者无论做什么都可以完成这项工作,我只是希望我不必改变我的模型以包含一个Long type2GroupId然后我填充type2实例。事实。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

我找不到任何方法,所以我添加了对它的支持:https://github.com/mybatis/mybatis-3/pull/203

@Result(property = "type2", column = "type2_group_id", javaType = Type2.class,
    one = @One(select = "com...mapper.Type2Mapper.getByGroupId",
            parameterProvider = @OneParameterProvider(
                    type = TemporalParameterProvider.class, method = "getParametersWithDate"
            )))

public class TemporalParameterProvider {
    public Object getParametersWithDate(Object value, Class<?> type, List<Object> originalParameters) {
        Map<String, Object> parameters = new HashMap<String, Object>();
        parameters.put("0", originalParameters.get(0));
        parameters.put("1", value);
        return parameters;
    }
}

这也可用于查询原始列值的计算,并希望其他用例也可用。