これは回避策ですが、データベース内のプロシージャを変更して名前を追加することはできないため、別の方法で考えることはできません。
考えられるのは、これらのフィールドに固有の型ハンドラを作成することです。名前のないフィールドが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になります。