1

有從存儲過程輸出到Java數據類型映射休眠數據類型到輸出從混合類型

一個問題映射的數據類型使用一個SQLServer, 我給出的以下2個表最初的存儲過程 - 不能改變他們的定義。

CREATE TABLE [dbo].[tblDetail](
    ... 
[dCdeType] [dbo].[Tcde] NOT NULL, 
    [dCdeState] [dbo].[Tvch] NOT NULL, 
    ... 
) 

CREATE TABLE [dbo].[tblAP](
    ... 
[apChState] [char](2) NOT NULL, 
[apChTaxType] [char](2) NOT NULL, 
    ... 
) 

我創建了第三個表 - 如果必須,我可以更改其定義。

CREATE TABLE [dbo].[tblTempAP](
    ... 
[tpChState] [char](2) NOT NULL, 
[tpChTaxType] [char](2) NOT NULL, 
    ... 
) 

我有一個存儲過程 「sp_MyProcedure」,即使用Hibernate(3.1.3版)被稱爲從Java應用程序多次。
存儲過程從tblDetails中進行選擇並將記錄插入到tblTempAP中。然後它從tblAP

相同
select <list of fiields> into #tempD from tblDetails 
...some logic... 
INSERT INTO [dbo].[tblTempAP] 
     (... 
     ,[tpChType] 
     ,[tpChState] 
     ... 
) 
select <list of fields> from #TempD 
............some logic ..... 

select <list of fiields> into #tempA from tblAP 
... 
    INSERT INTO [dbo].[tblTempAP] 
     (... 
     ,[tpChType] 
     ,[tpChState] 
     ... 
) 
select <list of fields> from #TempA 

可以有「更新」,以及沿「一些邏輯」根據一些指標分析表tblTempAP。但是我質疑的兩個字段 - 數據類型是相同的。 「sp_MyProcedure」我們每次都從Java調用具有不同參數的循環,因此可以保證插入到tblTempAP中的數據每次都是不同的。

在存儲過程的結束時,我做

select <some fileds, including the 2 mentioned> 
from tblTempAP 
where <some criterias> 

輸出被取入Java和處理,基於業務邏輯積累。

Java代碼

String queryString = "{ call sp_MyProcedure(?) }"; 
Query q; 
    List resultList; 
    try { 
     q = session.createSQLQuery(queryString); 
     q.setInteger(0, port); 
       resultList = q.list(); 
    } 
    catch (HibernateException hex) { 
     throw new TaxPartnersSystemException("My Exception"); 
    } 

這是問題所在,我需要幫助! 在應用程序運行結束時,我已經填充了tblTempAP,並且在SQL Server管理工作室中查看時看起來很好。 但是,java端resultList中的數據有一個問題 - 我用調試器看到它​​,檢查元素 - 來的狀態只有一個字符 - 所以無論在tblTempAP中是「NY」將是「N」,「CA 「 - 將是」C「。 類型字段相同。那些單個字符是正確的。然而,像「03」這樣的東西 - 將會是「0」,「34」會出現爲「3」。

我認爲這是一個冬眠API內的映射

請幫助!問題在哪裏?如何弄清楚?請記住,我無法更改2個初始表 - 這是給定的。

我不在存儲過程中使用Cast或Convert。如果我應該,請告訴我在哪裏?從前兩個表中選擇?或者插入/更新第三個?

在此先感謝

回答

1

我已經解決了使用Hibernate結果變壓器的功能這樣的問題。 你只需要在接下來的方式擴展SQL查詢:

select RES1 as PROP1, RES2 as PROP2 from Table 
     (select sp_MyProcedure(?) from dual) 

然後創建結果POJO:

class MyProcRes { 
    public String getPROP1() {} 
    public void setPROP1(String prop1) {} 

    // same for PROP2 + constructors default and one with props 
} 

最後,你可以申請成果轉化到查詢結果:

List<MyProcRes> res = session.createSQLQuery(query).setResultTransformer(
          Transformers.aliasToBean(MyProcRes.class) 
        ).list(); 

而且您將獲得在MyProcRes對象中初始化的所有字段。