将hibernate数据类型映射到混合类型的存储过程的输出

时间:2014-05-21 23:24:01

标签: java hibernate data-binding type-conversion java-stored-procedures

将数据类型从存储过程输出映射到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,
    ...
)

我已经创建了第3个表 - 如果必须,我可以更改其定义。

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

可以有&#34;更新&#34;以及#34;某些逻辑&#34;根据一些标准来表tblTempAP。但我质疑的两个字段 - 数据类型是相同的。 &#34; sp_MyProcedure&#34;我们每次调用带有不同参数的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中的任何东西都是&#34; NY&#34;将是&#34; N&#34;,&#34; CA&#34; - 将是&#34; C&#34;。 类型字段相同。那些单一字符是正确的。但是,像&#34; 03&#34; - 将是&#34; 0&#34;,&#34; 34&#34;会出现在&#34; 3&#34;。

我认为它是hibernate API中的映射

请帮忙!哪里有问题?以及如何解决这个问题?请记住,我无法更改2个初始表 - 它是给定的。

我不在存储过程中使用Cast或Convert。如果我应该,请告诉我在哪里?从前2个表中选择时?或插入/更新第3个?

提前致谢

1 个答案:

答案 0 :(得分:1)

我已经使用Hibernate Result Transformer功能解决了这个问题。 您只需要以下一种方式扩展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对象中初始化所有字段。