将Hibernate createNativeQuery与TypedQuery一起用于Integer.class

时间:2019-02-12 16:20:35

标签: java hibernate

我想对带有Integer.class参数的TypedQuery使用休眠NativeQuery。有可能吗?

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

我在Web上发现了一些例子,表明从理论上讲这是可能的。

see getTaskCount()

更新1:我已经更新了示例。

更新2:添加getSingleResult()示例。

2 个答案:

答案 0 :(得分:0)

createNativeQuery()的第二个参数应该是一个映射的实体。整数不是。所以你必须做:

Query query = em.createNativeQuery("select 1 from dual");  
Integer val = (Integer) query.getSingleResult(); 

答案 1 :(得分:0)

resultClass参数仅接受实体类。

此外,在使用本机查询时,您无法保证数字的返回类型将是什么,因此在java.math.BigInteger中使用Integer或Long在类型转换中通常会给您带来麻烦。

您需要做的是:

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
}