问题描述
我想对带有Integer.class参数的NativeQuery
使用Hibernate TypedQuery
。
可能吗?
NativeQuery<Integer> query = session.createNativeQuery("select 1 from dual", Integer.class);
query.list(); //<--Error. Caused by: org.hibernate.MappingException: Unknown entity: java.lang.Integer
要么
query.getResultList(); //<--Error. Caused by: org.hibernate.MappingException: Unknown entity: java.lang.Integer
要么
query.getSingleResult(); //<--Error. Caused by: org.hibernate.MappingException: Unknown entity: java.lang.Integer
我在网上发现了一些例子,这些例子从理论上讲是可行的。
更新1:我已经更新了示例。
更新2:添加getSingleResult()示例。
1楼
createNativeQuery()的第二个参数应该是一个映射的实体。 整数不是。 因此,您必须执行以下操作:
Query query = em.createNativeQuery("select 1 from dual");
Integer val = (Integer) query.getSingleResult();
2楼
resultClass参数仅接受实体类。
另外,在使用本机查询时,您永远无法保证数字的返回类型是什么,因此在java.math.BigInteger
使用Integer或Long在类型转换中通常会给您带来java.math.BigInteger
。
您需要做的是:
Query query = em.createNativeQuery("select 1 from dual");
Number nval = (Number) query.getSingleResult();
Integer val = nval == null ? null : nval.intValue();
或获取列表:
Query query = em.createNativeQuery("select 1 from dual");
List<Number> l = (List<Number>) query.getResultList();
for (Number nval : l) {
Integer val = nval == null ? null : nval.intValue();
// do stuff
}