带有游标结果的存储过程的mybatis注释配置

问题描述

我是 mybatis 的新手,我有一个问题。
我有一个返回 CURSOR 的 Oracle 存储过程。

我不明白如何用注释编写结果集。

如果我试试这个,

@Mapper
public interface Message{

    @Select(value="{ #{OUT,javaType=java.sql.ResultSet,resultMap=messageQueryResult,jdbcType=CURSOR,mode=OUT} = call get_messages() }")
    @Options(statementType = StatementType.CALLABLE)
    @ResultMap("messageQueryResult")
    List<Message> getMessages();
}
<mapper namespace="de.foo.mapper.Message">
    <resultMap id="messageQueryResult" type="de.foo.mapper.MessageValue">
    
            <result column="ID" javaType="java.lang.Long" />
            <result column="NOTE" javaType="java.lang.String" />

    </resultMap>
</mapper>
public class MessageValue{

    private Long id;
    private String note;
}
FUNCTION get_messages
  RETURN cursorType
  IS 
    c_messages  cursorType;
    sqlstring   VARCHAR2(4000);
  BEGIN
    sqlstring :=  'SELECT id,note FROM '||
                             ' vmessage WHERE ID IN ( ' ... ')';                                           

    OPEN cmessage FOR sqlstring;
    RETURN cmessage;
  END get_messages;

出现错误

org.apache.ibatis.reflection.ReflectionException: There is no setter for property named 'OUT' in 'class java.lang.class'

我做错了什么? 是否有可能在注释中编写 XML 映射器?

解决方法

您需要解决一些问题。

  1. 您必须在结果映射中指定 <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> <label for="pin"> Pincode</label></br> <input type="tel" pattern="[1-9][0-9]{5}$" id="pin" name="pin" required=""> <label for="hospital">Hospital:</label> *</br> <select id="hospital" name="hospital" required=""> <option value="govt">Government</option> <option value="private">Private</option></select> <div id="hiddengovtbsk"> <label class="hospitalgovtbsk"> <input type="radio" name="hospitalgbid" id="hospid" style="vertical-align: left,margin: 0px;" required=""> Banashankari UPHC,Dobhi Ghat,Government Hospital-Phone:080 8799 7765 </label></br> <label class="hospitalgovtbsk"> <input type="radio" name="hospitalgbid" id="hospid" style="vertical-align: left,margin: 0px;" required=""> Prathamika Arogya Kendra-Phone:080 2690 9079 </label></br> <label class="hospitalgovtbsk"> <input type="radio" name="hospitalgbid" id="hospid" style="vertical-align: left,margin: 0px;" required=""> - Arogya Kendra-Phone:080 8044 7834 </label></br> 属性。

    property
  2. 要将结果作为 OUT 参数接收,该方法需要一个参数。
    我使用 <resultMap id="messageQueryResult" type="de.foo.mapper.MessageValue"> <result column="ID" property="id" /> <result column="NOTE" property="note" /> </resultMap> 作为参数。如果您愿意,您可以使用带有属性 Map 的 POJO。
    此外,该方法的返回类型应为 out,并且应删除 void

    @ResultMap

执行后,结果会被设置到参数中,所以基本上就是你如何使用它。

@Select({
  "{ #{OUT,","javaType=java.sql.ResultSet,"resultMap=messageQueryResult,"jdbcType=CURSOR,"mode=OUT} = call get_messages() }" })
@Options(statementType = StatementType.CALLABLE)
void getMessages(Map<String,Object> param);

顺便说一下,我假设 Map<String,Object> param = new HashMap<>(); mapper.getMessages(param); List<MessageValue> messages = (List<MessageValue>) param.get("OUT"); ... 的意思是 cursorType


关于您的最后一个问题,可以使用注释 SYS_REFCURSOR@Results(文档为 here)来定义结果映射。
您的情况有点棘手,因为 MyBatis 在构建结果映射时使用带注释的方法的返回类型。因此,您可能需要添加另一个如下所示的映射器方法,而不是注释 @Result 方法。

getMessage()

此结果映射具有相同的 ID,因此您可以从 XML 映射器中删除 @Results(id = "messageQueryResult",value = { @Result(column = "ID",property = "id"),@Result(column = "NOTE",property = "note") }) @Select("select ID,NOTE from vmessage where ID = #{id}") MessageValue getById(@Param("id") Long id); ,它应该可以工作。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...