Hibernate DB2在使用NativeQuery时返回First Charector

时间:2015-12-01 09:06:34

标签: java hibernate orm db2 hibernate-native-query

在使用Hibernate Native Query从DB2 CHAR字段中获取数据时,我遇到了以下问题。

我有一个表结构和数据如下。

 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和COLUMN_ID是数字,但PARAM是CHAR(10)。 如果我手动运行以下查询(从Eclipse SQL插件),它将获取正确的结果。

SELECT CNTRL_4, COLUMN_ID, VALUE AS PARAM FROM MY_TABLE_NAME 

但是,如果我使用Java代码(Hibernate Native Query)运行相同的查询,那么我正在跟踪结果。

[{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}]

请查看 PARAM 数据,仅限第一个字符

我正在使用以下Java代码

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);

我还在Google上搜索了这个blog post,这与我的问题相同。据我所知,我通过对SQL查询进行类型转换来解决这个问题。但是现在我忘记了我做了什么,现在无法解决它。

请帮忙。

更新 类型转换解决了问题。请看我的答案。

2 个答案:

答案 0 :(得分:4)

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

{{1}}

说明:

  

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

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

如果有任何不利之处,请告诉我。

答案 1 :(得分: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值识别为String。