【问题标题】:mybatis - Passing multiple parameters on @One annotationmybatis - 在@One注解上传递多个参数
【发布时间】:2017-12-23 03:02:47
【问题描述】:

我正在尝试访问辅助数据库中的一个表,该表的名称是从我的主数据库中获取的。我的困难是将“DB-Name”作为参数传递到我的辅助查询中(顺便说一句,我使用的是基于 MyBatis 注释的映射器)。

这是我的映射器

@SelectProvider(type = DealerQueryBuilder.class, method = "retrieveDealerListQuery")
@Results({
    @Result(property="dealerID",                column="frm_dealer_master_id"),
    @Result(property="dealerTypeID",            column="frm_dealer_type_id",        one=@One(select="retrieveDealerTypeDAO")),
    @Result(property="dealerName",              column="frm_dealer_name")
})
public List<Dealer> retrieveDealerListDAO(@Param("firmDBName") String firmDBName);

@Select("SELECT * from ${firmDBName}.frm_dealer_type where frm_dealer_type_id=#{frm_dealer_type_id}")
@Results({
    @Result(property="dealerTypeID",            column="frm_dealer_type_id"),
    @Result(property="dealerType",              column="frm_dealer_type")
})
public DealerType retrieveDealerTypeDAO(@Param("firmDBName") String firmDBName, @Param("frm_dealer_type_id") int frm_dealer_type_id);

我拥有的firmDBName 是从我的“主数据库”中获得的。

  • 如果我在第二个查询中省略 ${firmDBName},则查询会尝试访问我的主数据库并抛出未找到表“PrimaryDB.frm_dealer_type”。所以它基本上是试图在我的主数据库中搜索一个名为“frm_dealer_type”的表。
  • 如果我尝试重写 @Result 之类的

    @Result(property="dealerTypeID", column="firmDBName=firmDBName, frm_dealer_type_id=frm_dealer_type_id", one=@One(select="retrieveDealerTypeDAO")),

它抛出一个错误,列“firmDBName”不存在。

  • 将 ${firmDBName} 更改为 #{firmDBName} 也没有帮助。

我确实参考了这个博客 - here

我想要一个解决方案,将我的参数firmDBName 从我的主查询传递到辅助查询。

【问题讨论】:

    标签: mybatis


    【解决方案1】:

    这里的限制是您的列必须由第一个@SELECT 返回。 如果您查看测试用例 here,您将看到第一个 Select 返回的 parent_xxx 值。 您的 DealerQueryBuilder 必须选择 firmDBName 作为返回值,并且您的列必须将返回列的名称映射到该值。

    您的列定义总是错误的,应该是: {frm_dealer_type_id=frm_dealer_type_id,firmDBName=firmDBName} 或您第一次选择时返回的任何内容。

    你可以再次参考我上面的测试用例以及这里的文档http://www.mybatis.org/mybatis-3/sqlmap-xml.html#Nested_Select_for_Association

    【讨论】:

    • 如果数据库表中不存在{parameter_Name=Column_Name}中指定的列名,如何将值以变量的形式传递给parameter_Name,如{parameter_Name=_my_variable_ }?
    • 它不必在你的 dB 表中,它只需要从你的 sqlprovider 生成的选择中返回。如果您能够为此提供 java 代码,我可以向您展示如何修复它。如果您看不到我在答案中链接的测试用例,您将看到它是如何通过第一个选择返回的。
    • 选择DB名作为返回值,自定义列名映射返回列名。问题得到解决。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-29
    • 2016-02-12
    • 2020-03-20
    相关资源
    最近更新 更多