MyBatis中使用带更新和ResultSet的存储过程调用

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时,我收到了另一个错误:整数无法转换为DtoCena类型。我将方法的返回值更改为Integer,并且没有错误,但是正如您所猜测的那样,它没有返回我想要的内容。
问题是,我可以映射更新表并返回ResultSet的存储过程吗?我可以使用JDBC来实现这一点,但是在MyBatis中是否可能?当使用@Select注释时我做错了什么吗?

它告诉我们其中一个变量为空。您至少可以在调试模式下检查它。此外,您能否发布更多的错误信息? - Horsing
1个回答

1
看起来 @Update 返回受影响的行数... 无论如何,我认为这个问题与调用存储过程无关,这只是一个简单 select 时会发生的映射问题。
你必须在 @Results 注解内使用 @Result 注解,否则它会被忽略。 以下是一个简化但功能正常的代码示例:
@Select("select 'hello' as h, 1 as n from dual")
@Results({
    @Result(column="n")
})
Integer test();

只需添加一个属性属性,并将返回类型更改为将结果检索到对象中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接