2

I am facing the following problem while using Hibernate Native Query to fetch data from DB2 CHAR field.

I have a table structure and data as follows.

 CNTRL_4 COLUMN_ID PARAM
 ------- --------- --------------------
       1         1 10                  
       1         2 12                  
       1         3 true                
       2         1 10                  
       2         2 13                  
       2         3 false               
       3         1 10                  
       3         2 16                  
       3         3 true                

CNTRL_4 and COLUMN_ID is number, But PARAM is CHAR(10). If I run the following query manually (From Eclipse SQL Plugin) it fetches the proper result.

SELECT CNTRL_4, COLUMN_ID, VALUE AS PARAM FROM MY_TABLE_NAME 

But if I run the same query with Java Code (Hibernate Native Query) Then I am getiing following Result.

[{CNTRL_4=1, COLUMN_ID=1, PARAM=1}, 
 {CNTRL_4=1, COLUMN_ID=2, PARAM=1}, 
 {CNTRL_4=1, COLUMN_ID=3, PARAM=t}, 
 {CNTRL_4=2, COLUMN_ID=1, PARAM=1}, 
 {CNTRL_4=2, COLUMN_ID=2, PARAM=1}, 
 {CNTRL_4=2, COLUMN_ID=3, PARAM=f}, 
 {CNTRL_4=3, COLUMN_ID=1, PARAM=1}, 
 {CNTRL_4=3, COLUMN_ID=2, PARAM=1}, 
 {CNTRL_4=3, COLUMN_ID=3, PARAM=t}]

Please look at the PARAM data, it is only the first character.

I am using following Java Code

String sql = "SELECT CNTRL_4, COLUMN_ID, VALUE AS PARAM FROM MY_TABLE_NAME";
SQLQuery query = hibernateUtil.getCurrentSession().createSQLQuery(sql);
query.setResultTransformer(Criteria.ALIAS_TO_ENTITY_MAP);
List<Map<String, Object>> data = (List<Map<String, Object>>) query.list();
System.out.println(data);

I also searched on Google and found this blog post, which is same as my problem. As per as I can remember I had solved this problem by typecasting on SQL query. But right now I forget that what I did and not able to solve it now.

Please help.

UPDATE: Problem solved by type casting. Please see my answer.

4

2 回答 2

4

通过类型转换我们可以解决如下问题

SELECT CNTRL_4, COLUMN_ID, RTRIM(CAST (VALUE AS VARCHAR(10))) AS PARAM FROM MY_TABLE_NAME 

解释:

由于 VALUE 列在 DB2 上被定义为 CHAR 并且 Hibernate 在使用转换器 Criteria.ALIAS_TO_ENTITY_MAP时正在检查字段的类型,因此它将数据转换为 Charecter。所以它只返回第一个字符。

但是在选择时,如果我们将类型更改为VARCHAR ,那么我的问题就会得到解决。

请让我知道是否有任何缺点。

于 2015-12-02T07:38:39.440 回答
2

尝试不使用转换器,因此将查询更改为:

String sql = "SELECT CNTRL_4, COLUMN_ID, VALUE AS PARAM FROM MY_TABLE_NAME";
SQLQuery query = hibernateUtil.getCurrentSession().createSQLQuery(sql);
List data = query.list();
System.out.println(data);

这应该只是将查询传递给底层的 DB2 驱动程序,所以它应该可以工作,除非 DB2 驱动程序不将该false值识别为字符串。

于 2015-12-01T11:46:14.337 回答