2017-12-21 9 views
0

プライマリDBから名前を取得しているセカンダリDBのテーブルにアクセスしようとしています。私の難しさは、 "DB-Name"を二次クエリにパラメータとして渡すことです(私はMyBatisアノテーションベースのマッパーを使用しています)。mybatis - @Oneアノテーションに複数のパラメータを渡す

これは私のマッパー

@SelectProvider(type = DealerQueryBuilder.class, method = "retrieveDealerListQuery") 
@Results({ 
    @Result(property="dealerID",    column="frm_dealer_master_id"), 
    @Result(property="dealerTypeID",   column="frm_dealer_type_id",  [email protected](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); 

私は私の "プライマリDB" から取得されていfirmDBNameです。

  • 2番目のクエリで$ {firmDBName}を省略すると、クエリはプライマリデータベースにアクセスしようとしていて、テーブル "PrimaryDB.frm_dealer_type"が見つかりません。したがって、基本的には、プライマリDBで "frm_dealer_type"という名前のテーブルを検索しようとしています。
  • 私は

    @Result(プロパティ= "dealerTypeID" のような@Resultを再書き込みしようとすると、列= "firmDBName = firmDBName、frm_dealer_type_id = frm_dealer_type_id"、1 =ワン(選択= "retrieveDealerTypeDAO" @ ))、

「firmDBName」列が存在しないというエラーが発生します。

  • $ {firmDBName}を#{firmDBName}に変更しても役に立たなかった。

私はこのブログを参照してくださいでした - here

私は解決策が二問合せに私の主なクエリからの私のパラメータfirmDBNameを渡したいです。

答えて

1

ここでの制限は、最初の@SELECTで列を返す必要があることです。 テストケースhereを見ると、最初のSelectが返す値はparent_xxxです。 DealerQueryBuilderは戻り値としてfirmDBNameを選択する必要があり、列は戻り列の名前をその列にマップする必要があります。

カラムの定義は常に間違っています。 {frm_dealer_type_id=frm_dealer_type_id,firmDBName=firmDBName}または最初の選択から返されたものでなければなりません。

{PARAMETER_NAME = COLUMN_NAME}で指定された列名は、Iが通過んどのように、DBテーブルに存在しない場合は、再度ここでhttp://www.mybatis.org/mybatis-3/sqlmap-xml.html#Nested_Select_for_Association

+0

ならびにドキュメント上に私が持っているテストケースを参照することができます変数の形のparameter_Nameの値は、 {parameter_Name = _my_variable_}のようになりますか? – Razvi

+0

これはdBテーブルにある必要はなく、sqlproviderによって生成されたselectから返されるだけです。あなたがそのためのJavaコードを提供できるなら、私はそれを修正する方法を示すことができます。テストケースを見ることができない場合、私は自分の答えでリンクし、最初の選択によってどのように戻ってくるかを見るでしょう。 – h3adache

+0

戻り値としてDB名を選択し、戻り列の名前をマッピングするカスタム列名を選択しました。問題は解決しました。ありがとう – Razvi

関連する問題