hibernate 调用存储过程 报错 数据库是sqlserver

小0 发布于 2012/07/18 11:15
阅读 1K+
收藏 0
	public List fy() {
		 List result = (List) this.getHibernateTemplate().execute(new
		 HibernateCallback() {
		 public Object doInHibernate(Session session)
		 throws HibernateException, SQLException {
		 String sql="{Call proc_pages(?,?,?,?,?,?,?,?)}";
		 Query query = session.createSQLQuery(sql);
		 System.out.println(sql);
		  query.setString(0, "tBuilding");
		  query.setString(1, "id");
		  query.setInteger(2, 0);
		  query.setInteger(3, 0);
		  query.setString(4, "*");
		  query.setInteger(5, 10);
		  query.setInteger(6, 1);
		  query.setString(7, "");
		  query.executeUpdate();
		 List list = query.list();
		 System.out.println("lsitlist" + list.size());
		 return list;
		 }
		 });
//		 for (Object tb1 : list) {
//		 Tbuilding tb = (Tbuilding) tb1;
//		 System.out.println("测试数据---------" + tb.getBuildingName());
//		 System.out.println("测试数据---------" + tb.getId());
//		 }
		return result;

	}

存储过程

USE [Test]
GO
/****** 对象:  StoredProcedure [dbo].[proc_pages]    脚本日期: 07/18/2012 11:10:18 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[proc_pages]
@strTable varchar(50), --表名 
@strColumn varchar(50), --按该列来进行分页 
@intColType int, --@strColumn列的类型,0-数字类型,1-字符类型,2-日期时间类型 
@intOrder bit, --排序,0-顺序,1-倒序 
@strColumnlist varchar(800), --要查询出的字段列表,*表示全部字段 
@intPageSize int, --每页记录数 
@intPageNum int, --指定页 
@strWhere varchar(800), --查询条件 
@intPageCount int OUTPUT --总页数 
AS 
begin
DECLARE @sql  nvarchar(4000) --用于构造SQL语句
DECLARE @where1 varchar(800) --构造条件语句
DECLARE @where2 varchar(800) --构造条件语句
IF @strWhere is null or rtrim(@strWhere)='' 
-- 为了避免SQL关键字与字段、表名等连在一起,首先为传入的变量添加空格
BEGIN --没有查询条件 
print 'asdfasd'
SET @where1=' WHERE ' 
SET @where2=' ' 
END 
ELSE 
BEGIN --有查询条件 
SET @where1=' WHERE ('+@strWhere+') AND ' 
SET @where2=' WHERE ('+@strWhere+') ' 
END 
set @strColumn = ' ' + @strColumn + ' '
set @strColumnlist = ' ' + @strColumnlist + ' '
--构造SQL语句,计算总页数。计算公式为 总页数 = Ceiling ( 记录个数 / 页大小 )
SET @sql='SELECT @intPageCount=CEILING((COUNT(*)+0.0)/'
+ CAST(@intPageSize AS varchar)
+ ') FROM ' + @strTable + @where2 
--执行SQL语句,计算总页数,并将其放入@intPageCount变量中
EXEC sp_executesql @sql ,N'@intPageCount int OUTPUT',@intPageCount OUTPUT 
--将总页数放到查询返回记录集的第一个字段前,此语句可省略
--SET @strColumnlist=' '+Cast(@intPageCount as varchar(30)) + ' as PageCount,' + @strColumnlist  
IF @intOrder=0 --构造升序的SQL
SET @sql='SELECT TOP '+ CAST(@intPageSize AS varchar) + 
@strColumnlist + 
' FROM ' + @strTable + @where1 + 
@strColumn + '>(SELECT MAX('+@strColumn+') '+ 
' FROM (SELECT TOP '+ CAST(@intPageSize*(@intPageNum - 1) AS varchar) + 
@strColumn + ' FROM '+ @strTable+@where2+'ORDER BY '+@strColumn+') t) ORDER BY '+ @strColumn 
ELSE --构造降序的SQL 
SET @sql='SELECT TOP '+ CAST(@intPageSize AS varchar) + 
@strColumnlist+ 
' FROM '+ @strTable + @where1 + 
@strColumn + '<(SELECT MIN('+@strColumn+') '+ 
' FROM (SELECT TOP '+ CAST(@intPageSize*(@intPageNum - 1) AS varchar) + 
@strColumn + ' FROM '+ @strTable+@where2+'ORDER BY '+@strColumn+' DESC) t) ORDER BY '+ 
@strColumn + ' DESC' 
IF @intPageNum=1--第一页 
SET @sql='SELECT TOP '+CAST(@intPageSize AS varchar) + @strColumnlist + ' FROM '+@strTable+ 
@where2+'ORDER BY '+@strColumn+CASE @intOrder WHEN 0 THEN '' ELSE ' DESC' 
END 
PRINT @sql  
print @intPageCount
--EXEC(@sql) 
end

数据库名字是Test 表名是tBuilding   存储过程的名字是proc_pages

报错信息是:could not execute native bulk manipulation query; nested exception is org.hibernate.exception.SQLGrammarException: could not execute native bulk manipulation query

加载中
0
鉴客
鉴客

手工执行下存储过程看有没有问题

0
小0
小0

引用来自“鉴客”的答案

手工执行下存储过程看有没有问题

这是手动执行的效果......

0
如风随影
如风随影
你查下hibernate怎么调存储过程的,要么直接用connection 调
返回顶部
顶部