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提供所有帮助.
如果您的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,它可能会更有效,但这不是必需的.
归档时间: |
|
查看次数: |
5904 次 |
最近记录: |