动态传递@ResultMap的值

时间:2014-06-18 16:55:22

标签: select annotations mybatis

我找不到动态传递@ResultMap值的方法。

e.g:

@Select(“select * from table_name”)

@ResultMap( “SomeResultMap”)

public List getAllMethod()

在上面的例子中,我希望动态传递@ResultMap的值,而不是使用“SomeResultMap”进行硬编码。

任何有关添加上述功能的帮助都将受到高度赞赏。

2 个答案:

答案 0 :(得分:0)

虽然可能以(非常)迂回的方式获得“动态注释”,但它增加了大量的开销,我认为这可能比仅具有多个更多涉及/复杂select具有不同的ResultMap注释。

有关管理费用的更多信息,请参阅Dynamic class annotation

除非您需要在运行时动态创建大量这些值,而这些值在未提前知道(在这种情况下,我认为这些运行时映射的查询也不会被知道,所以不清楚该用例是什么),我建议坚持使用硬编码注释。

根据OP的评论进行编辑:

对于您不知道确切参数的情况,您可以按照我为动态注释添加的链接,但正如我(以及该链接中的其他人)所说的那样,我认为最终会变得更加复杂并最终并没有真正避免明确地定义一堆事物(也就是说它最终不会变得非常动态)。

所以我建议对ResultMap进行硬编码,但有一点要记住,你真的只需要使用ResultMap来进行更复杂的映射。通常,可以通过将列别名化为ResultMap上的setter来在幕后使用隐含的POJO Bean

这需要从使用SELECT *切换到SELECT <col list>,但IMO,无论如何通常都会更好,因为它是一个明确的列表,您可以将列添加到具有较少副作用的表中(即它们不会自动包含在结果集中,并可能影响程序行为。)

答案 1 :(得分:0)

我们可以通过几种方式来解决它(以某种迂回的方式):

  1. 由于查询相同,我们可以将其提取为接口常量。现在我们可以使用特定的Result扩展覆盖此方法的Mapper接口,并在定义方法时引用接口常量并添加特定的ResultMap。
  2. Mapper.java

    interface Mapper {
        static final String SELECT_QUERY="select * from $tableName";
        List getAllMethod(@Param("tableName")String tableName);
    }
    

    FooMapper.java

    interface FooMapper extends Mapper {
        @Select({SELECT_QUERY})
        @ResultMap("FooMapper.Foo")
        List getAllMethod(@Param("tableName")String tableName);
    }
    

    现在我们可以将这个特定的Mapper注入到Configuration中并使用它。在查询复杂且在一个地方抽象的情况下,这很有用

    1. 我们可以使用javassist动态创建一个新的Mapper类,它将使用正确的命名空间添加@ResultMap注释。这可以在将映射器添加到配置的DAO中完成。

    2. 我们可以为@ResultMap输入占位符值,并使用AspectJ通过切入点将其替换为正确的值。我没有尝试过,但https://bugs.eclipse.org/bugs/show_bug.cgi?id=313026可能是阻挡者。

    3. 是的,这些看起来很难看,但应该有效。但是,如果MyBatis支持为ResultMap表达式插入@Param值也会更好。

      希望这有帮助!