我正在尝试使用表值参数来处理我们使用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();
当然setParameter
或setParameterList
都不在这里工作。如何将我的字符串列表映射到此类型以用作参数?
答案 0 :(得分:0)
我无法找到解决此问题的方法。我的解决方法是将整个存储过程复制到Java中的字符串中。在上面的例子中,这意味着我替换了:
String fakeQueryStr = "call TestStringListType :list";
与
String fakeQueryStr = "SELECT * FROM :list";
在我的实际代码中,这是不可取的,因为存储过程是一组明显更长的语句,但是当它包含在字符串中的BEGIN
和END
时仍然有效。