2

(MyBatis v3.0.4を使用しています。)解決方法がわからないという問題があります。私のオブジェクトモデルは次のとおりです。

Location.java


public class Location {
    // ... other content
    private List addresses; 
    // ... other content
}

Address.java


public class Address { 
    public enum Type { POSTAL, POBOX, INPUT, CLEANSED } 
    private Type type; 
    private String line1; 
    // ... other content
}

私のSQLは次のとおりです。


SELECT 
    // ... other content 
    postal_address_line_1, 
    postal_address_line_2, 
    postal_address_city, 
    cleansed_address_line_1, 
    cleansed_address_line_2, 
    cleansed_address_city, 
    // ... other content

resultMap適切な列を正しいタイプのアドレスインスタンスにプラグインし、Location.javaの同じリストに追加するを構築するにはどうすればよいですか?別のタイプのアドレスを保持するためだけに、Location.javaに別のインスタンス変数を追加する必要はありません。

4

2 に答える 2

3

結果マップで識別子タグを使用します。

mybatis ユーザーガイドを見てください。「discriminator」で検索すると、さらに詳しい情報が表示されます。

<resultMap id="vehicleResult" type="Vehicle">
   <id property=”id” column="id" />
   <result property="sharedPropA" column="shared_column"/>
   <discriminator javaType="int" column="address_type">
     <case value="1" resultMap="postalResultMap"/>
     <case value="2" resultMap="inputResultMap"/>
     <case value="3" resultMap="cleanResultMap"/>
     <case value="4" resultMap="whatIsaCleansedAddressResultMap"/>
   </discriminator>
</resultMap>

追加 1:

アドレスを異なる行として選択する必要があります。

すなわち

select
    postal_address_line_1 as line1, 
    postal_address_line_2 as line2, 
    postal_address_city as city,
    type as 'POSTAL'

....

連合

select
    postal_address_line_1 as line1, 
    postal_address_line_2 as line2, 
    postal_address_city as city,
    type as 'CLEANSED'

.....

次に、組み込みの列挙型ハンドラーが型を正しく設定する必要があります。

于 2011-06-11T00:14:44.510 に答える
1

Andy Pryor の提案に従って、SQL ステートメントを次のように更新することで問題を解決できました。

SELECT 
// ... other content 
'POSTAL' as Postal_Address_Type,
postal_address_line_1, 
postal_address_line_2, 
postal_address_city,
'CLEANSED' as Cleansed_Address_Type,
cleansed_address_line_1, 
cleansed_address_line_2, 
cleansed_address_city, 
// ... other content

次に、次のように更新resultMapします。

<resultMap ...>
    //... other content
    <association property="postalAddress" javaType="com.x.y.z.Address">
        <result property="type" column="Postal_Address_Type"/>
        <result property="line1" column="Address_Part_1_Name"/>
        <result property="line2" column="Address_Part_2_Name"/>
        //...other content
    </association>
    <association property="cleansedAddress" javaType="com.x.y.z.Address">
        <result property="type" column="Cleansed_Address_Type"/>
        <result property="line1" column="Address_Part_1_Name"/>
        <result property="line2" column="Address_Part_2_Name"/>
        //...other content
    </association>
</resultMap>

最後に、私のAddressクラス内ではsetType(Type)、組み込みの列挙型ハンドラーが魔法のように機能します。クラス内ではLocation、インスタンスのリストを 1 つだけ持つことができAddress、さまざまな setXXXAddress() メソッドをこのリストに適切に追加できます。

残念なことに、列をある種のファクトリ クラスにプラグインすることはできませんが、私の意見では、ハードコードされた型を SQL ステートメントに入れることはそれほど汚いことではありません。欠点は、ドメイン モデルのAddress.Type値と SQL ステートメントの間にカップリングを導入したことですが、resultMapSQL XML がクラス内のインスタンス変数の名前を保持する必要があることを考えると、これはすでに存在しているようなものAddressです。

于 2011-07-05T10:38:59.563 に答える