调用带有更新的过程和MyBatis中的ResultSet

时间:2012-09-03 09:11:14

标签: sql-server stored-procedures annotations mybatis procedures

我想使用注释将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事件探查器,发现使用给定的参数正确调用了该过程。我注意到我正在映射的过程正在执行其他过程。他们正在进行一些更新。当我将注释更改为@Update时,我得到了另一个错误:整数不能转换为DtoCena类型。我将方法的返回值更改为Integer,但我没有错误,但您可以猜测它没有返回我想要的内容。

问题是,我可以映射更新表的存储过程并返回ResultSet吗?我可以使用JDBC来做到这一点,但这可以通过MyBatis实现吗?使用@Select注释时我做错了吗?

1 个答案:

答案 0 :(得分:1)

看起来@Update会返回受影响的行数... 无论如何,我不认为这个问题与调用存储过程有关,这只是一个简单选择会出现的映射问题。

您必须在 @Results 注释中使用 @Result 注释,否则会被忽略。 这是一个简化但功能强大的代码:

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

只需添加属性属性并更改返回类型即可将结果检索到对象中。