0

私はこの高低の答えを探しましたが、答えを得ることができません。

基本的に、iBatisを使用してデータベースに書き込んでいるオブジェクトがあります。これは、文字列、intなどのプリミティブ型で正常に機能しますが、私のオブジェクトの属性の1つは、他のオブジェクトの配列です。これを永続化してから、後で「selectById」ステートメントを呼び出して、配列を含む完全なオブジェクトを取得できるようにしたいと思います。

これが私がこれまでに持っているコードです:

Mapper.xml

  <insert id="insertTrade" parameterClass="TradeObject">
insert into TESTTABLE (
  ORDERID,
  MAXPX,
  COMMISSION,
  ACCOUNTGRP )
values (
  #orderID#, #maxPx#, #commission#, #accountGrp#
)

accountGrpは私の配列ですが、現在エラーをスローしています。このフィールドがなくても、ステートメントは正常に機能します。

Javaは次のようなものです。

  public static void insertTrade (Trade obj) throws SQLException {
  logger.debug("inserting trade. Order Id: " + obj.toString());
sqlMapper.insert("insertTrade", obj);

}

よろしくお願いします!!

4

1 に答える 1

2

私はMybatis3を使用しましたが、古いiBatisのものと同様であるはずです。JDBCのものを入手するには、このスレッドを読んでください。それは巨大なスレッドですが、そこにあります。「ArrayDescriptor」を探します。

基本的に、TypeHandlerを作成する必要があります。TypeHandlerで、setArrayを呼び出します。mybatis3.xではこのようなものになるはずです。リストでの作業は、toArrayメソッドで変換するだけです。これは例であり、パラメーターはString[]です。

import oracle.sql.ARRAY;
import oracle.sql.ArrayDescriptor;   
.....
public void setParameter(PreparedStatement ps, int i, Object parameter, JdbcType jdbcType) throws SQLException
{
 //null check?

   ArrayDescriptor desc = ArrayDescriptor.createDescriptor("STRARRAY ", ps.getConnection());
   ARRAY oracleArray = new ARRAY(desc, ps.getConnection(), parameter);
   ps.setArray(i, oracleArray);
}

おそらくibatisではこのようなものです

public void setParameter(ParameterSetter setter, Object parameter) throws SQLException
{
    ArrayDescriptor desc = ArrayDescriptor.createDescriptor("STRARRAY", setter.getPreparedStatement().getConnection());
    ARRAY oracleArray = new ARRAY(desc, setter.getPreparedStatement().getConnection(), parameter);
    setter.setArray(oracleArray);
}

そのスレッドで言うように、タイプを作成しました。

すなわち

CREATE OR REPLACE TYPE STRARRAY AS TABLE OF VARCHAR2 (255)

次に、SQLマップで、必ずタイプハンドラーを参照してください。

于 2011-06-11T00:33:33.073 に答える