使用hibernate将java表值参数转换为存储过程

ve7v8dk2  于 2021-07-09  发布在  Java
关注(0)|答案(1)|浏览(338)

我正在尝试对使用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 当然在这里工作。如何将字符串列表Map到此类型以用作参数?

axkjgtzd

axkjgtzd1#

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

String fakeQueryStr = "call TestStringListType :list";

具有

String fakeQueryStr = "SELECT * FROM :list";

在我的实际代码中,这是不受欢迎的,因为存储过程是一组非常长的语句,但在封装时仍然可以工作 BEGIN 以及 END 在字符串中。

相关问题