Hibernate DB2 Returns 使用本机查询时的第一个字符
Hibernate DB2 Returns First Charector while using NativeQuery
我在使用 Hibernate Native Query 从 DB2 CHAR 字段中获取数据时遇到以下问题。
我有一个table结构和数据如下。
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 本机查询)进行相同的查询,那么我将得到以下结果。
[{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 查询进行类型转换解决了这个问题。但是现在我忘记了我做了什么,现在无法解决。
请帮忙。
更新:
通过类型转换解决问题。请看我的回答。
尝试不使用变压器,因此将您的查询更改为:
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
值识别为字符串。
通过类型转换我们可以解决如下问题
SELECT CNTRL_4, COLUMN_ID, RTRIM(CAST (VALUE AS VARCHAR(10))) AS PARAM FROM MY_TABLE_NAME
解释:
Since VALUE column is defined as CHAR on DB2 and Hibernate is checking
the type of the filed while using transformer
Criteria.ALIAS_TO_ENTITY_MAP, then it is casting the data to Charecter. So it is returning the first character only.
但是在选择时,如果我们将类型更改为 VARCHAR 那么我的问题就解决了。
有什么不足之处请告诉我。
我在使用 Hibernate Native Query 从 DB2 CHAR 字段中获取数据时遇到以下问题。
我有一个table结构和数据如下。
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 本机查询)进行相同的查询,那么我将得到以下结果。
[{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 查询进行类型转换解决了这个问题。但是现在我忘记了我做了什么,现在无法解决。
请帮忙。
更新: 通过类型转换解决问题。请看我的回答。
尝试不使用变压器,因此将您的查询更改为:
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
值识别为字符串。
通过类型转换我们可以解决如下问题
SELECT CNTRL_4, COLUMN_ID, RTRIM(CAST (VALUE AS VARCHAR(10))) AS PARAM FROM MY_TABLE_NAME
解释:
Since VALUE column is defined as CHAR on DB2 and Hibernate is checking the type of the filed while using transformer Criteria.ALIAS_TO_ENTITY_MAP, then it is casting the data to Charecter. So it is returning the first character only.
但是在选择时,如果我们将类型更改为 VARCHAR 那么我的问题就解决了。
有什么不足之处请告诉我。