在使用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查询进行类型转换来解决这个问题。但是现在我忘记了我做了什么,现在无法解决它。
请帮忙。
更新 类型转换解决了问题。请看我的答案。
答案 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。