2016-10-31 24 views
0

MyBatisを使用してSybaseストアドプロシージャのResultSetをマップしようとしていますが、名前のないカラムに問題が発生しています。 手順全く名前を持たない2そのうち4列と単一の行を返す:MyBatisとSybaseのストアドプロシージャ - 名前付きカラムのResultSet

+---id---|------|-----------|---description---+ 
    1  name1 surname1  desc1 

resultmapに.xmlファイルが、この(第二及び第三の結果のタグを確認してください)のように見える:

​​

私はストアドプロシージャコードの制御がないので、名前のない列にエイリアスを追加することはできません。 MyBatisの以前のバージョンを調べると、過去にResultMapのcolumnIndexに通知することができましたが、現在は使用できなくなっているようです。 これに使用できるカスタムResultSetハンドラがありますか?または、カスタマイズされたTypeHandlerの何らかの種類ですか?

答えて

0

これは回避策ですが、データベース内のプロシージャを変更して名前を追加することはできないため、別の方法で考えることはできません。

考えられるのは、これらのフィールドに固有の型ハンドラを作成することです。名前のないフィールドが1つしかない場合は、空の列名を使用して単純にマップすることができます。

だからあなたの場合には結果マップは次のようになります。

<resultMap id="person" type="foo.Person"> 
    <result column="id" property="id"/> 
    <result column="" property="name" typeHandler="foo.PersonNameTypeHandler"/> 
    <result column="" property="surname" typeHandler="foo.PersonSurnameTypeHandler"/> 
    <result column="description" property="description"/> 
</resultMap> 

Sybaseドライバは「」として、すべての無名の列が返されます。

MyBatisでは、列を既存の列名にマップする必要があります。そうしないと、型ハンドラは呼び出されません。そのため、これらの列には偽の名前をつけることはできません。名前のない列には空を使用し、MyBatisに列を処理させるには空の名前を使用してください。

重要な部分がタイプハンドラである、それだけで「名前は」ことになっている列番号に基づいて値を返します。

public class PersonNameTypeHandler extends BaseTypeHandler<String> { 
    ... 
    @Override 
    public String getNullableResult(ResultSet rs, String columnName) { 
     return rs.getString(2); 
    } 
    ... 
} 

と呼ばれる方法がCOLUMNNAMEを渡すことに注意することが重要ですこの場合は空になりますので、無視して列インデックスで返します。

また、ResultSet列インデックスを使用すると、2取得の名前を取得するには、この場合のように姓の実装は次のようになり、1から始まり:

... 
return rs.getString(3); 
... 

もう一つの重要な詳細は、列の順序は関連していなければならないということですプロシージャーで定義された戻り次第、結果マップには戻されません。上記の結果マップの「説明」列の後に「名前」列があってもプロシージャの戻り値が変更されなかった場合、getStringで使用されるインデックスは4ではなく2になります。

関連する問題