Mybatis调用存储过程返回多个结果集

kwenpp 2016-02-02 02:45:35
环境:mybatis+spring+postgreSQL
问题:PostgreSQL的存储过程(函数)返回多个结果集(游标),通过mybatis无法获取。

数据库创建脚本如下:

CREATE TABLE t_user
(
user_id character(32) NOT NULL,
user_name character varying(30),
user_birthday date,
user_salary double precision
)
WITH (
OIDS=FALSE
);
ALTER TABLE t_user
OWNER TO postgres;


存储过程如下:

CREATE OR REPLACE FUNCTION t_user_func(id varchar(20))
RETURNS SETOF refcursor AS
$BODY$
Declare
code refcursor;
result refcursor;
BEGIN
--返回错误码
OPEN code FOR select 1010 as code;
RETURN NEXT code;
--返回查询结果集
OPEN result FOR EXECUTE 'select * from t_user where user_id =''' ||id||'''' ;
RETURN NEXT result;
RETURN;
End;
$BODY$
LANGUAGE plpgsql VOLATILE;


Mybatis映射文件:

<select id="getUserByID" parameterType="map" statementType="CALLABLE">
{call t_user_func(
#{id,jdbcType=INTEGER,mode=IN},
#{refcursor, mode=OUT,
jdbcType=OTHER, javaType=ResultSet, resultMap=userResultMap}
)
}
</select>

<resultMap id="userResultMap" type="com.cet.ngp.model.UserStruct">
<collection property="codes" ofType="com.cet.ngp.model.ResultCode">
<id column="code" property="code" jdbcType="INTEGER" />
</collection>
<collection property="users" ofType="com.cet.ngp.model.User">
<id column="user_id" property="userId" jdbcType="VARCHAR" />
<result column="user_name" property="userName" jdbcType="VARCHAR" />
<result column="user_birthday" property="userBirthday"
jdbcType="DATE" />
<result column="user_salary" property="userSalary" jdbcType="INTEGER" />
</collection>
</resultMap>


接口:

void getUserByID(Map<String, Object> map);


接口实现:

public List<UserStruct> getUserById(String id) {
ApplicationContext ctx= DBModule.getConfigContext();
UserMapper userDao=(UserMapper) ctx.getBean("userMapper");

Map<String, Object> map = new HashMap<String, Object>();
map.put("id", id);
userDao.getUserByID(map);
//此处获取结果集
List<UserStruct> resultList = (ArrayList<UserStruct>) map.get("refcursor");

return resultList;
}


测试代码:

@Test
public void testGetUser() {
UserService userService = new UserService();
List<UserStruct> us = userService.getUserById("2");
System.out.println(us);
}


返回的结果是这样的:
[UserStruct [users=[], code=[ResultCode [code=1010]]]]
这里的users结果集没有获取到。。。
...全文
1353 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
kwenpp 2016-02-23
  • 打赏
  • 举报
回复
引用 8 楼 welling319 的回复:
存储过程 return 不就终止了后面的脚本吗?
通过JDBC也可以获取两个结果集,关键代码如下:

ResultSet rs = stmt.executeQuery("select * from t_user_func('2')");
			if (rs.next()) {
				// first result set returned
				Object o = rs.getObject(1);
				if (o instanceof ResultSet) {
					ResultSet rs1 = (ResultSet) o;
					while (rs1.next()) {
						int id = rs1.getInt(1);
						System.out.println(id);
					}
				}
			}

			if (rs.next()) {
				// process second ResultSet
				Object o = rs.getObject(1);
				if (o instanceof ResultSet) {
					ResultSet rs2 = (ResultSet) o;
					while (rs2.next()) {
						String id = rs2.getString(1);
						String name = rs2.getString(2);
						System.out.println("id=" + id + ";name=" + name);
					}
				}
			}
但是,通过mybatis结果集映射的方式,却获取不了我想要的结果。
kwenpp 2016-02-23
  • 打赏
  • 举报
回复
引用 8 楼 welling319 的回复:
存储过程 return 不就终止了后面的脚本吗?

这是postgresql函数返回多个游标的写法,通过脚本可以获取多个结果集。
kwenpp 2016-02-22
  • 打赏
  • 举报
回复
搞了好多天了,还是没有进展。。。。
ZiglarXie 2016-02-22
  • 打赏
  • 举报
回复
存储过程 return 不就终止了后面的脚本吗?
kwenpp 2016-02-03
  • 打赏
  • 举报
回复
前提是数据库存储过程不能改。
kwenpp 2016-02-03
  • 打赏
  • 举报
回复
好像没人理我
kwenpp 2016-02-02
  • 打赏
  • 举报
回复
感觉问题应该是在resultMap?数据集没有映射过来?
kwenpp 2016-02-02
  • 打赏
  • 举报
回复
我把存储过程做了一下调整,两个结果集的位置换了一下: CREATE OR REPLACE FUNCTION t_user_func(id varchar(20)) RETURNS SETOF refcursor AS $BODY$ Declare code refcursor; result refcursor; BEGIN --返回查询结果集 OPEN result FOR EXECUTE 'select * from t_user where user_id =''' ||id||'''' ; RETURN NEXT result; --返回错误码 OPEN code FOR select 1010 as code; RETURN NEXT code; RETURN; End; $BODY$ LANGUAGE plpgsql VOLATILE; 这时候执行测试代码,可以返回User结果集: [UserStruct [users=[User [userId=2 , userName=lx, userBirthday=Sun Feb 01 00:00:00 CST 2015, userSalary=111.0]], code=[]]] 但是,无法返回code结果集,也就是说每次只能返回一个结果集。
kwenpp 2016-02-02
  • 打赏
  • 举报
回复
请各位大侠帮我看一下,需要怎么改才能获取到User结果集,谢谢!

67,512

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧