表值参数使用Hibernate进入存储过程

时间:2017-07-14 18:45:55

标签: java sql sql-server hibernate tsql

我正在尝试使用表值参数来处理我们使用Hibernate的Session.createSQLQuery调用的存储过程。

我在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都不在这里工作。如何将我的字符串列表映射到此类型以用作参数?

1 个答案:

答案 0 :(得分:0)

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

String fakeQueryStr = "call TestStringListType :list";

String fakeQueryStr = "SELECT * FROM :list";

在我的实际代码中,这是不可取的,因为存储过程是一组明显更长的语句,但是当它包含在字符串中的BEGINEND时仍然有效。