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

Posted

技术标签:

【中文标题】将休眠数据类型映射到混合类型存储过程的输出【英文标题】:Mapping hibernate datatypes to output from stored procedure of mixed types 【发布时间】:2014-05-21 23:24:01 【问题描述】:

将数据类型从存储过程输出映射到 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 也可以有“更新”以及“某些逻辑”。但我质疑的 2 个字段 - 数据类型是相同的。 “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 Management Studio 中查看时看起来不错。 但是,java 端的 resultList 中的数据有问题 - 我用调试器查看它,检查元素 - 到来的状态只有一个字符 - 所以 tblTempAP 中的“NY”将是“N”,“CA” - 将是“C”。 类型字段相同。那些是单个字符的是正确的。但是,像“03”这样的东西会是“0”,“34”会变成“3”。

我认为这是hibernate API内部的映射

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

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

提前致谢

【问题讨论】:

【参考方案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 对象中初始化所有字段。

【讨论】:

以上是关于将休眠数据类型映射到混合类型存储过程的输出的主要内容,如果未能解决你的问题,请参考以下文章

将 MySQL JSON 列映射到休眠值类型

是否可以使用休眠映射不同的字段类型?

如何将Mysql中的位类型映射到休眠?

实体框架 - 您能否将导入的存储过程的结果类型映射到自定义实体类型?

使用实体框架/休眠与 sql2008 地理数据类型

休眠:具有递归深度搜索的存储过程:映射/输出问题