SqlSession#select
もう1つのオプションは、CreateHandlerを使用することです。これは、クエリから返されるデータを処理するためにメソッドに渡すことができるMyBatisインターフェースです。
これを使用して問題を解決する方法は次のとおりです。
まず、PriceResultHandlerを次のように定義します。
import org.apache.ibatis.session.ResultContext;
import org.apache.ibatis.session.ResultHandler;
public class PriceResultHandler implements ResultHandler {
// keep a list, assuming you have multiple Price objects to handle
List<Price> lp = new ArrayList<Price>();
@Override
public void handleResult(ResultContext rc) {
// the result object is map with column names mapped to values like so:
// {price1=11.32, qty1=15500, price2=2.62, qty2=234, etc.}
HashMap<?,?> m = (HashMap<?,?>) rc.getResultObject();
Price p = new Price();
double[] prices = new double[]{ ((Number)m.get("price1")).doubleValue(),
((Number)m.get("price2")).doubleValue(),
((Number)m.get("price3")).doubleValue() };
int[] qty = new int[]{ ((Number)m.get("qty1")).intValue(),
((Number)m.get("qty2")).intValue(),
((Number)m.get("qty3")).intValue() };
p.setPrices(prices);
p.setQty(qty);
lp.add(p);
}
public List<Price> getPrices() {
return lp;
}
ResultHandlerがHashMapを受け取る理由は、マッピングを次のように設定するためです。
<select id="getPrices" resultType="hashmap">
SELECT price1, price2, price3, qty1, qty2, qty3
FROM table
WHERE ...
</select>
次に、Javaコードで次のように呼び出します。
PriceResultHandler rh = new PriceResultHandler();
session.select("getPrices", rh);
// or
session.select("getPrices", arg, rh);
// where arg is a value to pass to the getPrices query mapping
Price p = rh.getPrices().get(0);
このモデルは、他の回答で示した他のオプションとほぼ同じ量の作業です。MyBatisは、JDBC ResultSetをマップにマッピングするだけで、適切と思われるドメインオブジェクトを作成します。
この方法の注意点の1つは、マップ内の列名の大文字と小文字を区別する問題に対処する必要があることです。MyBatisでこれを制御することはできません。基盤となるJDBCドライバーの動作によって異なります:https ://stackoverflow.com/a/11732674/871012