همه میدونیم که Hibernate و JPA اومدن تا
ما رو از شر نوشتن StroreProcedure راحت کنن . اصلا Hibernate و StoreProcedure یه
جوارییی با هم متضاد هستن . حالا اگه به دلیلی در یه پروژه ای احتیاج داشتیم تا یک StoreProcedure را اجرا کنیم , Hibernate این امکان را به ما می دهد تا با استفاده از
متد createSQLQuery این کار را انجام دهیم . با کلیک بر روی لینک های زیر میتوانید
نمونه کد نوشته شده در این زمینه را مشاهده کنید :
Person.java
PersonDAO.java
PersonDAOImpl.java
PersonBO.java
PersonBOImpl.java
psvm.java
spring.xml
دارم به یه مساله ای فکر میکنم: من یک StoreProcedure نوشتم
که میاد عملیات FEFO را در انبار انجام میدهد.آی دی درخواستی که
به انبار اومده بعنوان ورودی بهش پاس داده میشه و میره اون کالایی که تاریخ انقضاش زودتره رو برمیداره
و آماده خروج از انبار میکنه.
این StoreProcedure الان داره کار میکنه بنظر شما اگه بخوام این تراکنش
ها رو با کمک هایبرنیت پیاده سازی کنم قضیه چه جوریه :
ALTER PROCEDURE [dbo].[SP14_FEFO]
@OrderID VARCHAR(200)
AS
BEGIN
--################################################################
DELETE FROM dbo.OrderBatchLack
WHERE OrderID=@OrderID
--delete kasri allocate systemi
--################################################################
DECLARE crsA CURSOR LOCAL FAST_FORWARD FOR
SELECT
Goods.ID AS GoodsID
, Goods.GoodCode
, Goods.GoodName
, OrderDetail.ODPUQU - dbo.FN22_FindDisplacedForOrder(@OrderID,Goods.ID) AS GoodsQty
FROM
Goods INNER JOIN
OrderDetail ON Goods.ID = OrderDetail.GoodsID INNER JOIN
OrderHeader ON OrderDetail.OrderID =
OrderHeader.ID
WHERE
OrderHeader.Activation = 1
AND OrderDetail.Activation = 1
AND OrderHeader.ID = @OrderID
AND OrderDetail.ODPUQU - dbo.FN22_FindDisplacedForOrder(@OrderID,Goods.ID) <> 0
--=====================================================================================
OPEN crsA;
declare
@crsA_GoodsID varchar(50)
declare
@crsA_GoodCode varchar(50)
declare
@crsA_GoodName varchar(50)
declare
@crsA_GoodsQty varchar(50)
FETCH NEXT FROM crsA INTO @crsA_GoodsID,
@crsA_GoodCode, @crsA_GoodName , @crsA_GoodsQty
--=====================================================================================
WHILE @@FETCH_STATUS = 0
BEGIN
declare @x bigint
set @x =
CAST(@crsA_GoodsQty
as varchar(50))
PRINT('init @x= '+cast(@x as varchar(50)));
--#######################################################################
DECLARE crsB CURSOR LOCAL FAST_FORWARD FOR -- Nested cursor
SELECT ID, OnHandy FROM Batch WHERE
Activation = 1
AND OnHandy <> 0
AND GoodsID = @crsA_GoodsID
ORDER BY BExpireDate ,
BBatchNo
OPEN crsB
declare @crsB_BatchID varchar(50)
declare @crsB_OnHandy bigint
FETCH NEXT
FROM crsB INTO @crsB_BatchID ,
@crsB_OnHandy
WHILE @@FETCH_STATUS
= 0
BEGIN
--========================================================
IF(@x = 0)
BEGIN BREAK; END
PRINT('@crsB_BatchID = '+@crsB_BatchID);
PRINT('@crsB_OnHandy = '+cast(@crsB_OnHandy as varchar(50)) );
--========================================================
set @x = @x - @crsB_OnHandy
--========================================================
declare @khoruj bigint
if(@x>=0)
begin
set @khoruj = @crsB_OnHandy
end;
else if(@x <0)
begin
set @khoruj = @x + @crsB_OnHandy
set @x=0;
end;
--========================================================
--PRINT('@khoruj =
'+CAST(@khoruj AS VARCHAR(50)));
declare @khorujCU as varchar(50)
select @khorujCU = dbo.FN12_GetQty('Case.Unit',@crsA_GoodsID,@khoruj)
--PRINT('@khorujCU =
'+@khorujCU);
exec dbo.SP07_OrderBatch 'INSERT',@OrderID,'',@crsA_GoodsID,@crsB_BatchID
,@khorujCU
--========================================================
FETCH NEXT FROM crsB INTO
@crsB_BatchID , @crsB_OnHandy
END
CLOSE crsB
DEALLOCATE crsB
--#######################################################################
PRINT('final @x = '+cast(@x as varchar(50)));
if(@x<>0)
begin
insert into dbo.OrderBatchLack(OrderID,GoodsID,GoodsCode,GoodsName,ItemQty) values (@OrderID,@crsA_GoodsID,@crsA_GoodCode, @crsA_GoodName,@x)
end
--#######################################################################
FETCH NEXT
FROM crsA INTO
@crsA_GoodsID, @crsA_GoodCode, @crsA_GoodName ,
@crsA_GoodsQty
END
CLOSE crsA;
DEALLOCATE crsA;
--=====================================================================================
END