如何解决带有游标结果的存储过程的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 映射器?
解决方法
您需要解决一些问题。
-
您必须在结果映射中指定
<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
-
要将结果作为 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);
,它应该可以工作。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。