Hibernate存储过程结果

dha*_*rga 4 stored-procedures hibernate sql-server-2005

我被迫从代码管理自动增量字段.我决定编写一个存储过程来为我做这个.我们的想法是拥有一个插入新行并将自动递增的值返回给Java的过程,以便我可以进一步使用它.以下是我到目前为止的情况.我不知道要改变什么来填补空白,使一切顺利.

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE addNewMSO
    @sourceApplication char(8), 
    @selectionStatusDate datetime = NULL,
    @sysLstUpdtUserId char(10)
AS
BEGIN
    SET NOCOUNT ON;

    Declare @newVal int
    SET @newVal = (select max(seqNo) from MemberSelectedOptions) + 1

    INSERT INTO MemberSelectedOptions
       ([SourceApplication]
       ,[SeqNo]
       ,[SelectionStatusDate]
       ,[SysLstUpdtUserId])
 VALUES
      (@sourceApplication
       ,@newVal
       ,@selectionStatusDate
       ,@sysLstUpdtUserId)

END
GO
Run Code Online (Sandbox Code Playgroud)

然后在我的Java代码中,我有以下内容.

@NamedNativeQuery(name="addNewMSO", 
  query="exec addNewMSO :sourceApplication :selectionStatusDate :sysLstUpdtUserId", callable=true)
Run Code Online (Sandbox Code Playgroud)

我的DAO称之为......

Query q = session.getNamedQuery("addNewMSO");
q.setParameter("sourceApplication", mso.getSourceApplication());
q.setParameter("selectionStatusDate", mso.getSelectionStatusDate());
q.setParameter("sysLstUpdtUserId", mso.getSysLstUpdtUserId());
q.executeUpdate();
Run Code Online (Sandbox Code Playgroud)

即使这样,这也行不通,因为我得到了"尚未支持纯本机标量查询"错误.所以我不知道下一步该去哪里.我已经阅读了Hibernate文档,但我不知道如何从SP获取返回值.但我还是不能称之为......唉!

TIA提供所有帮助.

Pas*_*ent 5

如果您的SP没有返回结果集,那么我担心您将不得不使用session.getConnection()原始JDBC.根据Hibernate的文档:

16.2.2.使用存储过程进行查询

Hibernate3通过存储过程和函数提供对查询的支持.以下大多数文档对两者都是等效的. 存储过程/函数必须返回一个结果集作为第一个能够使用Hibernate的out参数.(......)

16.2.2.1.使用存储过程的规则/限制

除非遵循某些过程/函数规则,否则不能将存储过程与Hibernate一起使用.如果他们不遵守这些规则,他们就无法使用Hibernate.如果您仍想使用这些程序,则必须通过它们执行它们 session.connection().每个数据库的规则都不同,因为数据库供应商具有不同的存储过程语义/语法.

存储过程查询无法分页 setFirstResult()/setMaxResults().

推荐的调用表单是标准的SQL92:{ ? = call functionName(<parameters>) }{ ? = call procedureName(<parameters>}.不支持本机调用语法.

(......)

对于Sybase或MS SQL Server,以下规则适用:

  • 该过程必须返回结果集.请注意,由于这些服务器可以返回多个结果集和更新计数,因此Hibernate将迭代结果并将结果集的第一个结果作为其返回值.其他一切都将被丢弃.
  • 如果您可以在您的过程中启用SET NOCOUNT ON,它可能会更有效,但这不是必需的.