sql-server - 在 MyBatis 中调用带有更新和结果集的过程

标签 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 Profiler,发现使用给定参数正确调用了该过程。我注意到我正在映射的过程正在执行其他过程。他们正在执行一些更新。当我将注释更改为 @Update 时,出现了另一个错误:Integer 无法转换为 DtoCena 类型。我将该方法的返回值更改为 Integer 并且我没有收到任何错误,但您可以猜到它没有返回我要查找的内容。

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

最佳答案

看起来 @Update 返回受影响的行数 ... 不管怎样,我不认为这个问题与调用存储过程有关,这只是一个简单的选择会发生的映射问题。

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

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

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

关于sql-server - 在 MyBatis 中调用带有更新和结果集的过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12244964/

相关文章:

java - 通过Java Spring注解替换字符串

java - Spring MVC 对 Controller 映射非常困惑

c# - 如何在sql server 2008中使用新创建的服务器名登录

mysql - MYSQL存储过程中动态选择列的Using Case

sql - 寻找 SQL 事务日志文件查看器

c# - 在 Visual Studio 中使用 SQL Server 存储过程

sql - 将列表传递给存储过程不起作用

java - 是否可以在监听更改的变量上创建注释?

sql - 在sql server中一次插入固定行数2000行

sql - 内置 MAX 函数只返回一个整数