2017-07-14 18 views
0

我试图使用表值参数来存储我们使用Hibernate的Session.createSQLQuery调用的存储过程。使用Hibernate将表值参数导入存储过程

我创建了一个类型,并存储在SQL过程:

CREATE TYPE StringListType AS TABLE 
(
    StringText NVARCHAR(256) 
) 

CREATE PROCEDURE [dbo].[TestStringListType] 
( 
    @stringList StringListType READONLY 
) 
AS 
    SELECT * FROM @stringList 

我可以在SQL中使用这项功能:

BEGIN 
Declare @StringListTemp As StringListType 

insert INTO @StringListTemp (StringText) 
values ('foo'), ('bar'), ('baz') 

EXEC TestStringListType @StringListTemp 
END 

我想用Java做的是一样的东西:

String fakeQueryStr = "call TestStringListType :list"; 
SQLQuery fakeQuery = getSession().createSQLQuery(fakeQueryStr); 
ArrayList<String> data = Lists.newArrayList("foo", "bar", "baz"); 
fakeQuery.setParameter("list", data); 
return fakeQuery.list(); 

无论setParametersetParameterList在这里工作的过程。如何将我的字符串列表映射为此类型以用作参数?

回答

0

我无法找到解决此问题的解决方案。我的解决方法是将整个存储过程复制到Java中的字符串中。在上面的例子中,这将意味着我代替:

String fakeQueryStr = "call TestStringListType :list"; 

String fakeQueryStr = "SELECT * FROM :list"; 

在我实际的代码,这是不可取的,因为存储过程是一组语句显著较长,但它在字符串内包装BEGINEND时仍然可以工作。

相关问题