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);

该过程选择一行 - 我对一列感兴趣。现在,我之前已经映射了一个过程,只有我有多行并从中选择了多于一列。一切正常。当我映射新程序时,以类似的方式出现错误:

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

我启动了 SQL Profiler 并看到使用给定参数正确调用了该过程。我注意到我正在映射的过程正在执行其他过程。他们正在执行一些更新。当我将注释更改为 @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 回答