3

注釈を使用して、SQL Server ストアド プロシージャを MyBatis にマップしたいと考えています。

@Select(value = "{call sp_cen_obliczcene(" +
    "#{wytworId, mode=IN, jdbcType=NUMERIC}, " +
    "#{rodzajCenyId, mode=IN, jdbcType=NUMERIC}, " +
    "#{walutaId, mode=IN, jdbcType=NUMERIC}, " +
    "#{jmId, mode=IN, jdbcType=NUMERIC}, " +
    "#{ilosc, mode=IN, jdbcType=DECIMAL}, " +
    "#{data, mode=IN, jdbcType=DATE})}")
@Result(property = "kwota", column = "kwota", javaType = BigDecimal.class, jdbcType = JdbcType.DECIMAL)
@Options(statementType = StatementType.CALLABLE)
public DtoCena dajCene(CriteriaCena parametry);

この手順では、1 つの行を選択します。1 つの列に関心があります。今、私は以前に手順をマップしましたが、複数の行があり、それらから複数の列を選択しただけです。すべてが完璧に機能しました。新しいプロシージャをマップすると、同様の方法でエラーが発生しました。

### The error occurred while setting parameters
### SQL: {call sp_cen_obliczcene(?, ?, ?, ?, ?, ?)}
### Cause: java.lang.NullPointerException

SQL プロファイラを起動すると、プロシージャが指定されたパラメータで適切に呼び出されることがわかりました。マッピングしているプロシージャが他のプロシージャを実行していることに気付きました。彼らはいくつかの更新を実行しています。注釈を @Update に変更すると、別のエラーが発生しました。Integer は DtoCena 型にキャストできません。メソッドの戻り値を Integer に変更したところ、エラーは発生しませんでしたが、ご想像のとおり、探していたものが返されませんでした。

問題は、テーブルを更新して ResultSet を返すストアド プロシージャをマップできるかどうかです。JDBC を使用してこれを行うことができますが、MyBatis では可能ですか? @Select アノテーションを使用するときに何か問題がありますか?

4

1 に答える 1

1

@Update が影響を受ける行数を返すように見えます... とにかく、問題はストアド プロシージャの呼び出しに関連しているとは思いません。これは単純な選択で発生する単なるマッピングの問題です。

@Resultsアノテーション内で@Resultアノテーションを使用する必要があります。それ以外の場合は無視されます。以下は、単純化された機能的なコードです。

@Select("select 'hello' as h, 1 as n from dual")
@Results({
    @Result(column="n")
})
Integer test();

プロパティ属性を追加し、戻り値の型を変更して、結果をオブジェクトに取得するだけです。

于 2016-11-14T16:24:32.310 に答える