我正在将应用程序从 Hibernate 4.x 迁移到 Hibernate 5.3.6。该应用程序有这样的查询:
SQLQuery query = getSession().createSQLQuery("SELECT a.a, a.b, a.c FROM aTable");
由于createSQLQuery方法已被弃用,我首先用 Hibernate Javadoc 中建议的替代方法替换了方法调用,即使用 createNativeQuery:
NativeQuery query = getSession().createNativeQuery("SELECT a.a, a.b, a.c FROM aTable");
这样做的问题是它会产生一个编译器警告“NativeQuery 是原始类型。对泛型类型 NativeQuery 的引用应该被参数化”。此外,当然,我想从类型化查询中受益,因为现在它们可用。所以我将查询更改为
NativeQuery<Object[]> query = getSession().createNativeQuery("SELECT a.a, a.b, a.c FROM aTable", Object[].class);
现在的问题是执行查询
List<Object[]> retList = query.list();
产生错误
javax.persistence.PersistenceException:org.hibernate.MappingException:未知实体:[Ljava.lang.Object;
研究这个问题似乎表明在使用类型化本机查询时不可能使用非映射实体(这似乎是一个严重且不必要的限制,但我在这里离题了)。
问题是:有没有什么方法可以在实现类型安全的同时执行本地 SQL 查询,使用 Hibernate 返回一个对象数组,而不会产生编译器警告?如果没有,是否有任何明智的选择?
万千封印
慕慕森
相关分类