我很遗憾地需要对我的项目的一部分使用'native'sql查询来从未映射的表返回元组。
我有一堆查询,它们应该返回每行相同数量的值,然后进入处理方法将它们变成对象。
例如:
List<Object[]> list = ...;
List<MyBean> beans = ...;
SQLQuery qry1 = session.createSQLQuery(...);
SQLQuery qry2 = session.createSQLQuery(...);
SQLQuery qry3 = session.createSQLQuery(...);
list.addAll(qry1.list());
list.addAll(qry2.list());
list.addAll(qry3.list());
for(Object[] tuple : list)
{
MyBean bean = new MyBean();
bean.setSomething0(tuple[0]);
bean.setSomething1(tuple[1]);
bean.setSomething2(tuple[2]);
bean.setSomething3(tuple[3]);
beans.add(bean);
}
现在,我的问题是qry3
没有相关列来填充元组的第二个索引处的值,但确实填充了第三个索引。我需要修改它的查询,以便以某种方式用null
或""
填充元组。
我已尝试"select a, b, null, d"
和"select a, b, '', d"
,但这两个都会导致异常:
org.hibernate.MappingException: No Dialect mapping for JDBC type: 1111
at org.hibernate.dialect.TypeNames.get(TypeNames.java:56)
at org.hibernate.dialect.TypeNames.get(TypeNames.java:81)
at org.hibernate.dialect.Dialect.getHibernateTypeName(Dialect.java:370)
at org.hibernate.loader.custom.CustomLoader$Metadata.getHibernateType(CustomLoader.java:559)
at org.hibernate.loader.custom.CustomLoader$ScalarResultColumnProcessor.performDiscovery(CustomLoader.java:485)
at org.hibernate.loader.custom.CustomLoader.autoDiscoverTypes(CustomLoader.java:501)
at org.hibernate.loader.Loader.getResultSet(Loader.java:1796)
at org.hibernate.loader.Loader.doQuery(Loader.java:674)
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:236)
at org.hibernate.loader.Loader.doList(Loader.java:2213)
at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2104)
at org.hibernate.loader.Loader.list(Loader.java:2099)
at org.hibernate.loader.custom.CustomLoader.list(CustomLoader.java:289)
at org.hibernate.impl.SessionImpl.listCustomQuery(SessionImpl.java:1695)
at org.hibernate.impl.AbstractSessionImpl.list(AbstractSessionImpl.java:142)
at org.hibernate.impl.SQLQueryImpl.list(SQLQueryImpl.java:152)
那么在这种情况下如何告诉我的查询跳过索引?
答案 0 :(得分:3)
您可以尝试将其转换为预期类型:
select a, b, cast(null as varchar), d
答案 1 :(得分:0)
或者,只需检查元组数组的长度,不要尝试设置你没有的参数......